マルチコアと同期

C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。

  1. Avolatileを付けた変数は、ほかのスレッドから読めなくなるから
  2. Bvolatileはコンパイラの最適化を抑えるだけで、操作の不可分性やほかのコアから見える順番を保証しないから
  3. Cvolatileを付けると、変数がディスクに保存されて遅くなるから
答えと解説を見る

正解:B. volatileはコンパイラの最適化を抑えるだけで、操作の不可分性やほかのコアから見える順番を保証しないから

volatileは、変数の読み書きを省いたりまとめたりしないようコンパイラに指示するもので、もともとはハードウェアのレジスタの操作のためのものです。CPUがメモリ操作の順番を入れ替えることは防げず、counter++のような操作も不可分になりません。C11やC++11以降は、_Atomicやstd::atomicを使うと、不可分性とメモリの順番の両方が保証されます。

  • A. ほかのスレッドからも読めます。
  • B. 正しい。スレッド間の同期にはアトミック変数を使います。
  • C. ディスクに保存されることはありません。
この分野を解く 分野ページへ

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

  1. C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
  2. 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。
  3. ロックフリー(lock-free)のアルゴリズムの性質として正しいものはどれか。
  4. クリティカルセクションの説明として正しいものはどれか。
  5. 並列プログラムで使われるバリア同期の説明として正しいものはどれか。