データ競合
データ競合とは、「同時」に起きた読み書きにより、同じ時点において操作されたはずのデータが異なる状態を指し示す現象またはその状態である。
マルチスレッドのプログラムにおいて、データ競合は次の条件がすべて満たされた場合に発生する。
1つのプロセス内の2つ以上のスレッドがメモリ上の同じ場所に同時にアクセスする。
そのアクセスの少なくとも1つが書き込みアクセスである。
どのスレッドも、排他的ロックを使用して、そのメモリへのアクセスを制御していない。
これら3つの条件が成立すると、アクセス順序が非決定的となり、アクセス順序により、実行のたびに演算結果が異なることがある。
例えば2つのスレッド(スレッドA・スレッドB)が存在し、初期値が1の共有変数xにアクセスするとする。スレッドAはxの読み取り (read) を、スレッドBはxに値2の書き込み (write) を試みる。スレッドAとスレッドBが「同時」にxへの操作を行なった場合、結果はどうなりうるであろうか。1つの可能性はスレッドAが1を読み取りスレッドBが2を書き込む形であり、他の候補としてはスレッドBが2を書き込みスレッドAが2を読み取ることもありうる。あるいは本来同時に行ない得ない操作を同時実行してしまったことで未定義の振る舞いをするかもしれない。この一貫性を失なわせる現象、あるいは一貫性の失なわれた状態が「データ競合」である。
データ競合は「同時」に行なわれた操作によって発生するため、シングルスレッドプログラムでは発生せず、マルチスレッドプログラムにおいてのみ発生しうる。
データ競合(データきょうごう、英: data race)は、単一のデータに対する同時読み書きが非一貫性を引き起こす現象、あるいはその状態である。