マルチコアと同期

メモリバリア(フェンス)命令の役割として正しいものはどれか。

  1. Aバリアより前のメモリ操作が、バリアより後の操作より先にほかのコアから見えることを保証する
  2. Bメモリを物理的に区切って、アクセスを禁止する
  3. Cプログラムの実行をすべてのスレッドが揃うまで止める
答えと解説を見る

正解:A. バリアより前のメモリ操作が、バリアより後の操作より先にほかのコアから見えることを保証する

CPUはメモリ操作の順番を入れ替えることがあるので、ほかのコアと決まった順番でデータを受け渡すには、それを止める指示が必要です。メモリバリアは、その前の読み書きをすべて終えてから(ほかのコアに見えるようにしてから)、後ろの読み書きを行わせます。ロックの取得や解放の中にもバリアの働きが含まれていて、ロックで守った変数が正しく受け渡されます。

  • A. 正しい。メモリ操作の順番の入れ替えを止めます。
  • B. アクセスの禁止はページの保護などの仕組みです。
  • C. それはスレッドどうしのバリア同期です。
この分野を解く 分野ページへ

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

  1. 上のコードで、スレッド1がdataを用意してからflagで知らせ、スレッド2がflagを見てからdataを読む。弱いメモリ一貫性モデルのCPUで、スレッド2が確実に42を読むために必要なこととして正しいものはどれか。
  2. 取得(acquire)と解放(release)の意味を持つメモリ操作について正しいものはどれか。
  3. C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。
  4. C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
  5. 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。