0

MSDNRaymond Chenによると、0 は有効なスレッド ID ではありません。

しかし、ダンプを分析したところ、2 つのデッドロックされたクリティカル セクションの 1 つがロックされていましたが、OwningThread は 0 でした。

誰かが説明を手伝ってくれますか?

> !locks

CritSec ModuleA!lockerA+4 at 58cf4b24
WaiterWoken        No
LockCount          230
RecursionCount     0
OwningThread       0
EntryCount         0
ContentionCount    e6
*** Locked

CritSec ModuleA!$S2+8 at 58cf4b44
WaiterWoken        No
LockCount          0
RecursionCount     1
OwningThread       2154
EntryCount         0
ContentionCount    0
*** Locked

Scanned nnnn critical sections

> !cs 58cf4b24
-----------------------------------------
Critical section   = 0x58cf4b24 (ModuleA!lockerA+0x4)
DebugInfo          = 0x1cd3d8d0
LOCKED
LockCount          = 0xE6
WaiterWoken        = No
OwningThread       = 0x00000000
RecursionCount     = 0x0
LockSemaphore      = 0xCDC
SpinCount          = 0x00000000

> !cs 58cf4b44
-----------------------------------------
Critical section   = 0x58cf4b44 (ModuleA!$S2+0x8)
DebugInfo          = 0x1b1f1840
LOCKED
LockCount          = 0x0
WaiterWoken        = No
OwningThread       = 0x00002154
RecursionCount     = 0x1
LockSemaphore      = 0x0
SpinCount          = 0x00000000
4

1 に答える 1

0

ここには少なくとも2つの可能性があると思います。

1 つ目は、古くからのお気に入りであるメモリ破損の問題です。何らかの理由でスレッドがバッファの終わりを超えた場合、スレッド ID を保持するデータ構造に到達した可能性があります。私の意見では、これは確かに可能ですが、2つの可能性は低いです.

もう 1 つの可能性は、クリティカル セクションを終了せずにロック スレッドが「消えた」ことです。そのクリティカル セクションに入るのを待っているスレッドが多数あるように見えるため、競合数が多いことを考えると、その可能性が高いと思われます。

于 2013-07-24T06:13:51.700 に答える