マルチコアと同期

アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。

  1. Aメモリの値が期待した値と等しいときだけ新しい値を書き込み、成功したかどうかが分かる
  2. B2つのメモリの値を比べて、大きい方を両方に書き込む
  3. Cメモリの値とレジスタの値を、条件なしに入れ替える
答えと解説を見る

正解:A. メモリの値が期待した値と等しいときだけ新しい値を書き込み、成功したかどうかが分かる

CASは「この番地の値がまだ期待値のままなら新しい値に変える」を不可分に行います。読んでから書くまでの間にほかのスレッドが値を変えていれば失敗するので、変えられていないことを確かめながら更新できます。失敗したらもう一度読み直して計算し、CASをやり直すループにすれば、ロックを使わずに共有の値を安全に更新できます。x86のcmpxchg命令などがこれに当たります。

  • A. 正しい。比べて、等しければ入れ替えます。
  • B. 大きい方を書き込む命令ではありません。
  • C. 条件なしの入れ替えはスワップ(交換)命令です。
この分野を解く 分野ページへ

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

  1. 上のコードは、CAS(&p, 期待値, 新しい値)を使って共有の変数counterを2倍にしている。CASが失敗してループをやり直すのはどのようなときか。
  2. RISC-VのLR/SC(ロード予約/条件付きストア)のような命令の組で、SC(条件付きストア)が失敗するのはどのようなときか。
  3. CASを使ったロックフリーのデータ構造で問題になるABA問題の説明として正しいものはどれか。
  4. RISC-Vのamoadd.w命令やx86のlock xadd命令のような、フェッチ・アンド・アッド(fetch-and-add)命令の動作として正しいものはどれか。
  5. スピンロックの説明として正しいものはどれか。