競合状態
全体のフィードバック伝播時間より短い間隔で2回入力が変化すると発生する。入力信号に何らかの遅延要素を取り入れることで解決する場合がある。
T1 が i の値をインクリメントする : (i の現在値) + 1 = 1
T2 が i の値をインクリメントする : (i の現在値) + 1 = 1
i の最終値は期待されている 2 ではなく 1 となる。
以下は「check-then-act」(「条件の確認(check)、それに続く(then)条件に応じた動作(act)」を意味する典型的な処理)で発生する競合状態(Time of check to time of use)の例である。二つのタスクを示す擬似コードである。
出力結果は以下のようになるだろう:
ここで、以下のような順序でイベントが発生する場合を考える:
タイムアウトによってタスク Timeout が起動される。
タスク Timeout が A を調べ、偶数だったので、次の "print A" を実行しようとする。
端末から割り込みが発生し、タスク Received に切り換えられる。
タスク Received が最後まで動作し、A をインクリメントして "RX" を表示する。
制御がタスク Timeout に戻される。
そのタスクは A を表示するが、そのときに A の現在値を使用するため、5 が表示されてしまう。
ミューテックスは、並行プログラミングにおけるこのような問題に対処するために使われる。