マルチコアと同期
データ競合(データレース)の説明として正しいものはどれか。
- A複数のスレッドが同じ変数を同時に読むだけの状態
- B1つのスレッドが同じ変数に続けて2回書き込む状態
- C複数のスレッドが同じ変数に同期なしで同時にアクセスし、少なくとも1つが書き込みである状態
答えと解説を見る
正解:C. 複数のスレッドが同じ変数に同期なしで同時にアクセスし、少なくとも1つが書き込みである状態
データ競合は、同じ場所への読み書きの順番が同期によって決められていないために、どの順番で実行されたかで結果が変わってしまう状態です。タイミングによって起きたり起きなかったりするので、テストで見つけにくい不具合になります。C言語やC++では、データ競合のあるプログラムの動作は未定義とされます。ロックやアトミック変数で順番を決める必要があります。
- A. 読むだけなら値は変わらないので問題ありません。
- B. 1つのスレッドの中なら順番は決まっています。
- C. 正しい。結果が実行ごとに変わる原因になります。