マルチコアと同期

上のコードで、スレッド1がdataを用意してからflagで知らせ、スレッド2がflagを見てからdataを読む。弱いメモリ一貫性モデルのCPUで、スレッド2が確実に42を読むために必要なこととして正しいものはどれか。

// スレッド1         // スレッド2
data = 42;           while (flag == 0) { }
flag = 1;            print(data);
  1. Adataの型をintからlongに変える
  2. Bflagへの書き込みを解放(release)、flagの読み出しを取得(acquire)として順番を保証する
  3. Cスレッド2のループの中に何も書かないようにする
答えと解説を見る

正解:B. flagへの書き込みを解放(release)、flagの読み出しを取得(acquire)として順番を保証する

弱いモデルでは、スレッド1の2つの書き込みが入れ替わって見えたり、スレッド2のdataの読み出しがflagの読み出しより先に行われたりする可能性があり、flagが1なのにdataが古いままということが起こりえます。flagへの書き込みを解放にすると、それより前の書き込みが先に見えることが保証され、flagの読み出しを取得にすると、それより後の読み出しが先回りしなくなります。

  • A. 型を変えても順番は保証されません。
  • B. 正しい。dataの書き込みがflagより先に見えることが保証されます。
  • C. ループの中身は順番の保証と関係ありません。
この分野を解く 分野ページへ

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

  1. 取得(acquire)と解放(release)の意味を持つメモリ操作について正しいものはどれか。
  2. C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。
  3. C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
  4. 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。
  5. ロックフリー(lock-free)のアルゴリズムの性質として正しいものはどれか。