待機チェーンのトラバーサル
待機チェーン トラバーサル (WCT) を使用すると、デバッガーはアプリケーションのハングとデッドロックを診断できます。
待機チェーン は、スレッドと同期オブジェクトの交互のシーケンスです。各スレッドは、その後のオブジェクトを待機します。 次の各オブジェクトは、チェーン内の後続のスレッドによって所有されます。
スレッドは、スレッドがオブジェクトを要求してから取得されるまで、同期オブジェクトを待機します。 この ロック は、スレッドが取得してからスレッドが解放するまで、スレッドによって所有されます。 つまり、スレッド 1 がスレッド 2 が所有するロックを待機すると、スレッド 1 はスレッド 2 を 待機 します。
WCT では、次の同期プリミティブがサポートされています。
- 高度なローカル プロシージャ コール (ALPC)
- Microsoft コンポーネント オブジェクト モデル (COM)
- クリティカル セクション オブジェクト
- ミューテックス オブジェクト
- SendMessage 関数
- プロセスとスレッドに対する待機 操作
1 つ以上のスレッドの待機チェーンを取得するには、 OpenThreadWaitChainSession 関数と GetThreadWaitChain 関数を使用して WCT セッションを作成します。 WCT セッションは、 HWCT型のハンドルによって表されます。
セッションは同期または非同期にすることができます
待機チェーンが取得されるまで、同期セッションを取り消したり、呼び出し元のスレッドをブロックしたりすることはできません。
非同期セッションは呼び出し元のスレッドをブロックせず、 CloseThreadWaitChainSession 関数を使用して、アプリケーションによって取り消すことができます。 非同期操作の結果は、アプリケーションによって提供される WaitChainCallback コールバック関数を通じて使用できるようになります。
非同期セッションの場合、呼び出し元は GetThreadWaitChain を介してコンテキスト データ構造へのポインターを指定できます。 この同じポインターが WaitChainCallback コールバック関数に渡されます。
コンテキスト データ構造はユーザー定義であり、WCT に対して不透明です。 アプリケーションはコンテキスト データ構造を使用して、WCT クエリとコールバック関数の間でコンテキストを通信できます。 通常、この構造体を通じてイベント ハンドルを渡します。コールバックが実行されると、このイベントが通知され、クエリが完了したことが監視スレッドに通知されます。
待機チェーントラバーサルの例については、「WCT の使用」を参照してください。