マルチコアと同期
C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
- Aアトミック変数を、メモリのどこに置くかを指定するため
- B必要な順番の保証だけを選ぶことで、不要なバリアを避けて性能を保てるから
- Cスレッドを実行する順番を、あらかじめ決めておくため
答えと解説を見る
正解:B. 必要な順番の保証だけを選ぶことで、不要なバリアを避けて性能を保てるから
アトミック変数の操作は、既定では逐次一貫性(memory_order_seq_cst)で、最も分かりやすい代わりにバリアの負担が大きくなります。単純なカウンタなら不可分であればよいのでrelaxed、データを受け渡すフラグならacquireとreleaseで十分です。コンパイラは指定に合わせて、CPUのメモリモデルに必要な最小限の命令を出します。
- A. 置き場所の指定ではありません。
- B. 正しい。既定は最も強い逐次一貫性です。
- C. スレッドの実行順を決めるものではありません。