我发现许多讨论syncblk 输出的帖子显示MonitorHeld 计数为偶数且没有所有者线程。这已被解释为一个怪癖,锁正在转换,可能是因为所有者线程失败,所以没有所有者。对于每个服务员,MonitorHeld 计数增加 2,对于所有者,MonitorHeld 计数增加 1,因此,偶数意味着您有服务员但没有所有者。
我的syncblk 显示MonitorHeld 计数为奇数,没有拥有线程。这说明什么?另外,我有来自两个不同实例的两个不同的进程转储,如下所示,因此,这不是在正确的时间捕获转储的情况。
我的syncblk输出:
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 164 000000000a4d2428 1 1 000000002e406d30 16ac 144 0000000012f107c0 System.Object 368 000000000a3eb378 1125 0 0000000000000000 none 00000000104b1a38 System.Object 401 000000000a4d2888 1 1 000000002e79cce0 21a0 123 00000000110b09b0 System.Object 505 000000000a516918 1 1 000000002e55ca70 95c 114 00000000110984f0 System.Object 563 0000000002ae7978 1 1 000000002e7e1910 2058 261 00000000127d0300 System.Object 678 0000000002ae7f18 3 1 000000000a462240 f44 156 0000000012a66a28 System.Object ----------------------------- Total 814 CCW 0 RCW 1 ComClassFactory 0 Free 142 Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 122 000000002e561d98 3 1 000000000a621400 1410 180 0000000012cfcf28 System.Object 164 000000000a4d2428 1 1 000000002e406d30 16ac 145 0000000012f107c0 System.Object 368 000000000a3eb378 951 0 0000000000000000 none 00000000104b1a38 System.Object 401 000000000a4d2888 1 1 000000002e79cce0 21a0 124 00000000110b09b0 System.Object 505 000000000a516918 1 1 000000002e55ca70 95c 115 00000000110984f0 System.Object 563 0000000002ae7978 1 1 000000002e7e1910 2058 263 00000000127d0300 System.Object ----------------------------- Total 814 CCW 0 RCW 20 ComClassFactory 0 Free 76
最佳答案
锁要么处于转换状态,要么处于孤立状态。当拥有的线程终止而不释放它时,SyncBlk 就会成为孤立的。
关于windbg - 具有奇数 MonitorHeld 计数且无所有者的syncblk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192115/