競合状態
競合状態は、ソフトウェアのプログラムが正しく動作するために、1つ以上のプロセスのタイミングに依存している場合に発生します。スレッドが予期しないタイミングで実行または終了すると、誤った出力やプログラムのデッドロックなど、予測できない動作が発生することがあります。
ほとんどのソフトウェアプログラムはマルチスレッドであり、複数のスレッドを同時に処理できます。適切にプログラミングされたアプリケーションは、各スレッドの結果が想定された順序で処理されるようにします。プログラムが予測できない順序で実行されるスレッドに依存していると、競合状態が発生することがあります。
簡単な例として、ブール値を処理する論理ゲートを考えてみましょう。AND論理ゲートには2つの入力と1つの出力があります。入力AとBがtrueの場合、ANDゲートはTRUEを出力します。どちらか一方または両方の入力がfalseの場合、FALSEを出力します。変数AとBが読み込まれる前にプログラムが論理ゲートの結果を確認すると、競合状態が発生することがあります。正しい処理の流れは次のとおりです。
- 変数Aを読み込む
- 変数Bを読み込む
- AND論理ゲートの結果を確認する
誤った順序は次のとおりです。
- 変数Aを読み込む
- AND論理ゲートの結果を確認する
- 変数Bを読み込む
上の2つ目の例の結果は、1つ目の例と同じになる場合もあれば、異なる場合もあります。たとえば、変数Bが読み込まれる前も後もFALSEであれば、結果は変わりません。AがFALSEの場合、BがTRUEかFALSEかは関係ありません。しかし、AとBがどちらもtrueの場合、結果はTRUEになるはずです。論理ゲートの結果を確認した後に変数Bを読み込むと、FALSEという誤った結果になります。
競合状態によって生成される一貫性のない出力は、検出が難しいバグの原因になることがあります。プログラマーは、スレッドが一貫した順序で処理されるようにすることで、これらの問題を避けられます。
知識をテストする