マルチコアと同期

上の2つのスレッドを別々のコアで同時に実行する(コンパイラによる並べ替えはないとする)。逐次一貫性では起こらないが、x86などの実際のCPUでは起こりうる結果はどれか。

// 最初は x = 0, y = 0
// スレッド1      // スレッド2
x = 1;            y = 1;
r1 = y;           r2 = x;
  1. Ar1 = 1 かつ r2 = 1
  2. Br1 = 0 かつ r2 = 1
  3. Cr1 = 0 かつ r2 = 0
答えと解説を見る

正解:C. r1 = 0 かつ r2 = 0

逐次一貫性では、どちらかの書き込みが最初に行われるので、少なくとも一方の読み出しは1を見るはずです。しかし実際のCPUでは、x = 1はいったんコアのストアバッファに入り、ほかのコアに見える前に、後ろの読み出しr1 = yが主記憶やキャッシュから先に値を読めます。両方のコアで同じことが起きると、どちらも0を読みます。これを防ぐには、書き込みと読み出しの間にメモリバリアを入れます。

  • A. 両方の書き込みが先に終われば、逐次一貫性でも起こります。
  • B. スレッド1が先に全部終われば、逐次一貫性でも起こります。
  • C. 正しい。書き込みがストアバッファにある間に読み出しが先に進みます。
この分野を解く 分野ページへ

マルチコアと同期のほかの問題

  1. x86のメモリ一貫性モデル(TSO、トータルストアオーダー)の特徴として正しいものはどれか。
  2. ARMやRISC-V(RVWMO)のような弱いメモリ一貫性モデルについて正しいものはどれか。
  3. メモリバリア(フェンス)命令の役割として正しいものはどれか。
  4. 上のコードで、スレッド1がdataを用意してからflagで知らせ、スレッド2がflagを見てからdataを読む。弱いメモリ一貫性モデルのCPUで、スレッド2が確実に42を読むために必要なこととして正しいものはどれか。
  5. 取得(acquire)と解放(release)の意味を持つメモリ操作について正しいものはどれか。