データ競合
並列計算(parallel computing)/並行計算(concurrent computing)の分類は無関係である。シングルコアのCPU上では、(SMT環境を除き)マルチスレッドによる並列計算は処理時間短縮の効果がなく意味をなさないが、並行計算は応答性の改善などの効果があるため、シングルコア環境での並行計算にもマルチスレッドが使用されることは多い。シングルコアCPU上では、複数のスレッドが物理的に同時動作することはなく、オペレーティングシステムが短時間で実行コンテキストを切り替えることであたかも同時に動作しているかのようにみせかけているだけだが、データ競合は起こりうる。
データ競合を回避するには、ロックによる排他制御や、アトミック操作を利用する。
シングルスレッドプログラムであっても、割り込みにより、片方の処理を実行途中で一時停止し、もう一つの処理に切り替えて実行している場合、広義のデータ競合が起こりうる。これは「割り込み干渉」と呼ばれる。車載制御ソフトウェアなど、組み込みシステムでは割り込み処理が多用されるため、割り込み干渉の考慮と未然防止対策は必須である。
共有メモリやファイルなど、複数のプロセス間で共有されるリソースへの同時アクセスに関しても、排他制御しなければデータ競合が発生しうる。
害のない良性のデータ競合もあるが、多くのデータ競合はプログラムのバグとなる。
高水準言語のコード上において、異なる変数へのアクセスであるかのように見えても、メモリ上では同じバイトやワードへの読み書きとなる場合もあり、複数のスレッドでそれぞれの変数を同時に操作するとデータ競合となることがある(特にビットフィールド)。