volataileは最適化が抑制されるから、プログラムに書いてる通りに実行しますよってことでしょ。
でもこれは、言語レベルでマルチプロセッサ間の排他処理とは無関係。
プロセッサ間の排他処理にmutexやクリティカルセクションを使えばプロセッサの
アトミック命令が使われるのでメモリバリアが施されるってこと。

vc8 releaseでの逆アセンブル。

volatile int vola;
int nvola;
int _tmain(int argc, _TCHAR* argv[])
{
vola=argc;
00401000 mov eax,dword ptr [esp+4]
00401004 mov dword ptr [vola (403378h)],eax
nvola=vola; //volaは読み直されている。
00401009 mov ecx,dword ptr [vola (403378h)]
0040100F mov dword ptr [nvola (403374h)],ecx
return nvola;//nvolaは読み直されていない。
00401015 mov eax,ecx
}
00401017 ret