マルチコアと同期
C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。
- Avolatileを付けた変数は、ほかのスレッドから読めなくなるから
- Bvolatileはコンパイラの最適化を抑えるだけで、操作の不可分性やほかのコアから見える順番を保証しないから
- Cvolatileを付けると、変数がディスクに保存されて遅くなるから
答えと解説を見る
正解:B. volatileはコンパイラの最適化を抑えるだけで、操作の不可分性やほかのコアから見える順番を保証しないから
volatileは、変数の読み書きを省いたりまとめたりしないようコンパイラに指示するもので、もともとはハードウェアのレジスタの操作のためのものです。CPUがメモリ操作の順番を入れ替えることは防げず、counter++のような操作も不可分になりません。C11やC++11以降は、_Atomicやstd::atomicを使うと、不可分性とメモリの順番の両方が保証されます。
- A. ほかのスレッドからも読めます。
- B. 正しい。スレッド間の同期にはアトミック変数を使います。
- C. ディスクに保存されることはありません。