以下に、マルチスレッドプログラミングでよく起こるミスを示します。
大域メモリー (変更が可能で、かつ共有されている状態) にアクセスするときに同期機構で保護していないために、「データの競合」が発生する。1 つのプロセス内の 2 つ以上のスレッドが同じメモリー位置に同時にアクセスし、少なくとも 1 つのスレッドがそのメモリー位置に書き込もうとすると、データの競合が発生します。スレッドが排他的ロックを使用してそのメモリーへのアクセスを制御していない場合は、アクセスの順序が決定性ではなくなるため、その順序に応じて、実行するたびに異なる計算結果が生成されることがあります。問題にはならないデータの競合 (たとえば、ビジー状態の待機にメモリーアクセスが使用されている場合) もありえますが、データの競合の多くはプログラムのバグです。データの競合の検出には、Thread Analyzer ツールが有効です。「Thread Analyzer を使用したデータの競合およびデッドロックの検出」を参照してください。
2 つのスレッドが異なる順序で、同じ組の大域リソースへの権利を獲得しようとしてデッドロックが発生する。この場合は、一方のスレッドが最初のリソースを獲得し、もう一方のスレッドが 2 番目のリソースを獲得します。どちらかがリソースを放棄するまで処理が進まなくなります。Thread Analyzer ツールは、デッドロックの検出にも有効です。「Thread Analyzer を使用したデータの競合およびデッドロックの検出」を参照してください。
同期保護において見えない間隙が生じている。この保護における間隙は、保護されているコードセグメントに、呼び出し側に復帰する前に同期機構をいったん解放し、再度獲得する関数が含まれている場合に発生します。この結果、問題が発生します。呼び出し側から見ると大域データは保護されているようでも、実際には保護されていません。
UNIX のシグナルとスレッドを組み合わせて使用しているときに、非同期的なシグナルの処理に sigwait(2) モデルを使用しない。
*_cond_wait() または *_cond_timedwait() の呼び出しから復帰した後、条件の再評価に失敗した。
デフォルトスレッドを PTHREAD_CREATE_JOINABLE として生成した場合は pthread_join(3C) で再利用しなければならないことを忘れている。pthread_exit(3C) は記憶領域を解放しません。
深い入れ子の再帰呼び出しを行なったり、大量の自動配列を使用したりする。マルチスレッドプログラムはシングルスレッドプログラムよりもスタックの大きさの制限が厳しいので、問題が発生することがあります。
マルチスレッドプログラムの動作は、特にバグがある場合には、同じ入力で続けて実行しても再現性がないことがよくあります。この動作は、スレッドのスケジューリングの順序が異なる場合に発生します。
一般にマルチスレッドプログラムのバグは、決定的というよりも統計的な発生傾向を示します。このため実行レベルの問題を見つけるには、ブレークポイントによるデバッグよりも追跡の方が有効です。