競合状態
情報処理における競合状態は「イベントタイミングへの予期せぬ依存が引き起こす異常な振る舞い」である。特に複数のプロセスやスレッドが通信しながら動作する場合(並行計算)に発生するが、単一スレッドで動作している場合であっても、シグナルによる割り込みが原因で発生することもある。
以下は「read-modify-write」(「状態読み込み、変更、状態書き込み」を意味する典型的な処理)で発生する競合状態の例である。
2つのスレッド T1 と T2 がそれぞれグローバルな整数を 1 ずつインクリメントしていくとする。理想的には以下のような順序で処理したい。
整数 i = 0;
T1 が i の値を読み、レジスタに格納する : 0
T1 が i の値をインクリメントする : (i の現在値) + 1 = 1
T2 が i の値を読み、レジスタに格納する : 1
T2 が i の値をインクリメントする : (i の現在値) + 1 = 2
この例では、i の最終的な値として 2 を期待している。しかし、二つのスレッドは並行に動作し、ロックや同期などの機構を使用しないため、処理結果は間違ったものとなる可能性がある。以下にそのような場合のシナリオを示す。
整数 i = 0;
T1 が i の値を読み、レジスタに格納する : 0
T2 が i の値を読み、レジスタに格納する : 0