マルチコアと同期

RISC-Vのamoadd.w命令やx86のlock xadd命令のような、フェッチ・アンド・アッド(fetch-and-add)命令の動作として正しいものはどれか。

  1. Aメモリの値を読むだけで、足し算はレジスタの中で行う
  2. B2つのメモリの番地の値を足して、3つ目の番地に書く
  3. Cメモリの値に指定した数を不可分に足し、足す前の値を返す
答えと解説を見る

正解:C. メモリの値に指定した数を不可分に足し、足す前の値を返す

フェッチ・アンド・アッドは、読み出し・加算・書き込みを1つの不可分な操作として行うので、counter++のデータ競合を命令1つで解決できます。足す前の値が返るので、番号札を順に配るような処理(各スレッドに重ならない番号を割り当てるなど)にも使えます。CASのループより失敗とやり直しがないので、多くのスレッドが同時に更新する場合に有利です。

  • A. 足し算もメモリへの書き込みも不可分に行います。
  • B. メモリどうしの演算ではありません。
  • C. 正しい。共有のカウンタに向いています。
この分野を解く 分野ページへ

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

  1. スピンロックの説明として正しいものはどれか。
  2. スピンロックが向かない場面として最も適切なものはどれか。
  3. スピンロックで、ロックの変数をいきなりアトミック命令で書き換えようとするのではなく、普段は通常の読み出しで空くのを待ち、空いたと見えたときだけアトミック命令を使う(test-and-test-and-set)理由として正しいものはどれか。
  4. ミューテックス(眠って待つロック)とスピンロックを比べた説明として正しいものはどれか。
  5. デッドロックの例として正しいものはどれか。