マルチコアと同期
アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。
- Aメモリの値が期待した値と等しいときだけ新しい値を書き込み、成功したかどうかが分かる
- B2つのメモリの値を比べて、大きい方を両方に書き込む
- Cメモリの値とレジスタの値を、条件なしに入れ替える
答えと解説を見る
正解:A. メモリの値が期待した値と等しいときだけ新しい値を書き込み、成功したかどうかが分かる
CASは「この番地の値がまだ期待値のままなら新しい値に変える」を不可分に行います。読んでから書くまでの間にほかのスレッドが値を変えていれば失敗するので、変えられていないことを確かめながら更新できます。失敗したらもう一度読み直して計算し、CASをやり直すループにすれば、ロックを使わずに共有の値を安全に更新できます。x86のcmpxchg命令などがこれに当たります。
- A. 正しい。比べて、等しければ入れ替えます。
- B. 大きい方を書き込む命令ではありません。
- C. 条件なしの入れ替えはスワップ(交換)命令です。