マルチコアと同期
上の2つのスレッドを別々のコアで同時に実行する(コンパイラによる並べ替えはないとする)。逐次一貫性では起こらないが、x86などの実際のCPUでは起こりうる結果はどれか。
// 最初は x = 0, y = 0
// スレッド1 // スレッド2
x = 1; y = 1;
r1 = y; r2 = x;
- Ar1 = 1 かつ r2 = 1
- Br1 = 0 かつ r2 = 1
- Cr1 = 0 かつ r2 = 0
答えと解説を見る
正解:C. r1 = 0 かつ r2 = 0
逐次一貫性では、どちらかの書き込みが最初に行われるので、少なくとも一方の読み出しは1を見るはずです。しかし実際のCPUでは、x = 1はいったんコアのストアバッファに入り、ほかのコアに見える前に、後ろの読み出しr1 = yが主記憶やキャッシュから先に値を読めます。両方のコアで同じことが起きると、どちらも0を読みます。これを防ぐには、書き込みと読み出しの間にメモリバリアを入れます。
- A. 両方の書き込みが先に終われば、逐次一貫性でも起こります。
- B. スレッド1が先に全部終われば、逐次一貫性でも起こります。
- C. 正しい。書き込みがストアバッファにある間に読み出しが先に進みます。