countをそれぞれ1増やしても、実行順により結果が1になることがあります。ボタンで順序を決めてください。
count++を3段階に分けた競合実験
例を実行
各スレッドのボタンで順序を選択
スレッドA
Aのレジスタ-
共有メモリ
0
countスレッドB
Bのレジスタ-
黄色は次の命令です。交互実行で更新消失を確認できます。
count++は必ずしも不可分ではない
このモデルは読込み、レジスタ加算、書込みの3段階です。その間にスレッドが切り替わると競合が起こります。
両方が0を読んで1を書き戻すと、加算1回分が失われます。制御されない実行順に結果が依存するのが競合状態です。
クリティカルセクション
共有データを扱う範囲をクリティカルセクションと呼びます。1スレッドずつ全手順を行えば結果は2になります。同期には ミューテックスや セマフォです。