デッドロックは、2 つ以上のスレッドが互いの待ち状態になり、永久にその実行が妨げられる (滞る) 状態を表します。デッドロックの原因は数多く存在します。スレッドアナライザは、相互排他ロックの不適切な使用によって発生するデッドロックを検出します。この種のデッドロックは、マルチスレッドアプリケーションでよく起きます。2 つ以上のスレッドを持つプロセスで、次の条件が成立すると、デッドロックになる可能性があります。
すでにロックを保持しているスレッドが新しいロックを要求し、かつ
それらの新しいロック要求の発生タイミングが同時で、かつ
2 つ以上のスレッドが、それぞれチェーン内で次のスレッドが保持するロックを待つ循環チェーンを形成している。
次に簡単なデッドロック状態の例を示します。
スレッド 1 がロック A を保持していて、ロック B を要求 |
スレッド 2 がロック B を保持していて、ロック A を要求 |
デッドロックは、潜在的デッドロックと実 デッドロックの 2 種類に分けることができます。潜在的デッドロックはプログラムを実行すると必ず発生するわけではなく、スレッドのスケジューリングやスレッドによるロック要求のタイミングによって、プログラムの実行時に発生する可能性があるデッドロックです。これに対し実デッドロックは、プログラムの実行中に発生するデッドロックです。実デッドロックでは、関係するスレッドの実行は滞りますが、プロセス全体の実行は滞ることもあれば、そうでないこともあります。