一部のWindowsバージョンでは、負のロックカウントは正常な動作です。このフィールドの意味は、Windowsの存続期間中に変更されたことに注意してください(以下を参照)。
これらのプライベートフィールドの解釈は難しいビジネスであり、専用のクリティカルセクションデバッグツールを使用することでメリットが得られる場合があります。
たとえば、このMSDNの記事で詳細を確認してください。特に、-6の値が完全にもっともらしい理由を示していると思います。
いくつかの適切な抜粋:
クリティカルセクションは、さまざまな方法でユーザーモードで表示できます。各フィールドの正確な意味は、使用しているMicrosoftWindowsのバージョンによって異なります。
.....。
Microsoft Windows2000およびWindowsXPでは、LockCountフィールドは、スレッドがこのクリティカルセクションのEnterCriticalSectionルーチンを呼び出した回数から1を引いた回数を示します。このフィールドは、ロック解除されたクリティカルセクションの-1から始まります。EnterCriticalSectionを呼び出すたびに、この値が増加します。LeaveCriticalSectionを呼び出すたびに、それがデクリメントされます。たとえば、LockCountが5の場合、このクリティカルセクションはロックされ、1つのスレッドがそれを取得し、さらに5つのスレッドがこのロックを待機しています。
.....。
Microsoft Windows Server 2003 Service Pack 1以降のバージョンのWindowsでは、LockCountフィールドは次のように解析されます。
- 最下位ビットはロックステータスを示します。このビットが0の場合、クリティカルセクションはロックされています。1の場合、クリティカルセクションはロックされていません。
- 次のビットは、このロックのためにスレッドがウェイクアップされたかどうかを示します。このビットが0の場合、このロックのためにスレッドがウェイクアップされています。1の場合、スレッドはウェイクされていません。
- 残りのビットは1であり、ロックを待機しているスレッドの数の補数です。
次に、のロックカウントを解釈する方法について説明します-22
。したがって、要約すると、それはあなたが思っているよりもトリッキーです!