マルチコアと同期
RISC-Vのamoadd.w命令やx86のlock xadd命令のような、フェッチ・アンド・アッド(fetch-and-add)命令の動作として正しいものはどれか。
- Aメモリの値を読むだけで、足し算はレジスタの中で行う
- B2つのメモリの番地の値を足して、3つ目の番地に書く
- Cメモリの値に指定した数を不可分に足し、足す前の値を返す
答えと解説を見る
正解:C. メモリの値に指定した数を不可分に足し、足す前の値を返す
フェッチ・アンド・アッドは、読み出し・加算・書き込みを1つの不可分な操作として行うので、counter++のデータ競合を命令1つで解決できます。足す前の値が返るので、番号札を順に配るような処理(各スレッドに重ならない番号を割り当てるなど)にも使えます。CASのループより失敗とやり直しがないので、多くのスレッドが同時に更新する場合に有利です。
- A. 足し算もメモリへの書き込みも不可分に行います。
- B. メモリどうしの演算ではありません。
- C. 正しい。共有のカウンタに向いています。