8

Windows の RTL_CRITICAL_SECTION 構造体の LockCount フィールドが正当に負になる状況はありますか?

非常にとらえどころのないクラッシュを追跡しており、1 つの症状として、LockCount が負の CS が見られます。墜落時のカウントは-6ですが、日常的には-1、-2などのようです。

これが非常に悪いことであると仮定して、その後を追い払う前に、その仮定が正しいことを確認したいだけです. RTL_CRITICAL_SECTION の内部動作に関する情報はほとんど、またはまったく見つかりません。

4

2 に答える 2

12

一部の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。したがって、要約すると、それはあなたが思っているよりもトリッキーです!

于 2011-09-13T21:31:45.277 に答える
5

ここから、一部の説明です:

LockCountこれは、クリティカルセクションで最も重要なフィールドです。-1の値に初期化されます。0以上の値は、クリティカルセクションが保持または所有されていることを示します。-1に等しくない場合、OwningThreadフィールド(このフィールドはWINNT.Hで誤って定義されています。HANDLEではなくDWORDである必要があります)には、このクリティカルセクションを所有するスレッドIDが含まれています。このフィールドと(RecursionCount -1)の値の間のデルタは、クリティカルセクションの取得を待機している追加のスレッドの数を示します。

于 2011-09-13T21:32:06.680 に答える