競合状態 【race condition】 レースコンディション
概要
競合状態(race condition)とは、電子回路やコンピュータプログラムの動作が、外部の別の要因によって左右されること。同じ資源に複数の主体が同時にアクセスした場合などに生じ、正しく動作することも誤った結果になることもある不安定な状態である。電子回路の動作では、単一の入力が複数の経路に枝分かれして異なる論理素子を通り、再び合流するような回路で、経路の違いから値が変化するタイミングにずれが生じ、結果が不安定になる現象などを競合状態という。
コンピュータプログラムの動作では、並列に実行されている複数のプログラムやシステムが一つの資源(入出力装置やメモリ領域など)を操作する場合、互いの操作が不規則に入り混じって予期しない結果や動作を引き起こすことなどを競合状態という。
例えば、あるグローバル変数を読み込み、1を加算して書き戻すというプログラムがマルチスレッドで2つ動作している場合、スレッドAが処理を完了する前にスレッドBが値を読み込んで処理を開始してしまうと、Bの書き込みによってAの処理結果は破棄されてしまい、合わせて2加算されるはずが1しか加算されなくなってしまう。
このような状況では毎回誤った結果になるわけではなく、両者の処理のタイミングによって結果が異なる不安定な状態となるため、不具合箇所の発見や対処が難しくなる。排他制御(ロック)の仕組みを適切に利用し、共有資源の処理に原子性を確保する必要がある。
(2023.10.9更新)