マルチコアと同期

データ競合(データレース)の説明として正しいものはどれか。

  1. A複数のスレッドが同じ変数を同時に読むだけの状態
  2. B1つのスレッドが同じ変数に続けて2回書き込む状態
  3. C複数のスレッドが同じ変数に同期なしで同時にアクセスし、少なくとも1つが書き込みである状態
答えと解説を見る

正解:C. 複数のスレッドが同じ変数に同期なしで同時にアクセスし、少なくとも1つが書き込みである状態

データ競合は、同じ場所への読み書きの順番が同期によって決められていないために、どの順番で実行されたかで結果が変わってしまう状態です。タイミングによって起きたり起きなかったりするので、テストで見つけにくい不具合になります。C言語やC++では、データ競合のあるプログラムの動作は未定義とされます。ロックやアトミック変数で順番を決める必要があります。

  • A. 読むだけなら値は変わらないので問題ありません。
  • B. 1つのスレッドの中なら順番は決まっています。
  • C. 正しい。結果が実行ごとに変わる原因になります。
この分野を解く 分野ページへ

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

  1. 上のコードを2つのスレッドで同時に実行すると、counterの最終的な値が200000より小さくなることがある。その理由として正しいものはどれか。
  2. アトミック命令(不可分命令)の説明として正しいものはどれか。
  3. アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。
  4. 上のコードは、CAS(&p, 期待値, 新しい値)を使って共有の変数counterを2倍にしている。CASが失敗してループをやり直すのはどのようなときか。
  5. RISC-VのLR/SC(ロード予約/条件付きストア)のような命令の組で、SC(条件付きストア)が失敗するのはどのようなときか。