- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的应用程序有一个故障转储,显示有一堆线程在等待 syncblk,而 syncblk 显示它没有拥有线程。这怎么可能?我正在尝试在测试应用程序中重现该症状,但我无法弄清楚产生该结果可能会发生什么......拥有线程退出或死亡而不释放 syncblk 仍然显示为拥有该对象,只是threadid是“XXX”......我已经通过pinvoke使用完全托管的优雅退出和硬线程终止进行了测试......我测试了一堆没有脉冲的等待的不同组合,不匹配的进入和退出......没有任何东西产生阻塞线程并且不显示所有者的 syncblk.....我的想法已经用完了
这是我试图复制的故障转储的输出:(注意索引 #1236)
0:000> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
784 0000000004f12eb0 3 1 000000000508a460 32a8 68 00000001a0a20510
966 0000000004f06928 1 1 00000000052c5da0 2380 114 00000001df3080f8
1085 0000000004f23088 1 1 00000000052c8080 496c 120 00000001a0325238
1144 0000000005160d20 1 1 00000000050968b0 d74 56 00000000ff61b570
1151 0000000004f0c2c8 1 1 000000000508d8b0 3f64 77 000000017f66dc20
1236 0000000004f0b4f8 16 0 0000000000000000 none 000000019f1ec5d8
1261 0000000004f0ffe8 1 1 0000000008f18fc0 446c 94 000000013f8e70b0
1306 0000000004f0e918 1 1 00000000052c91f0 406c 123 000000011f5936f8
1318 0000000004f0e528 3 1 0000000008f1d580 24d8 106 000000015fc73f28
1329 0000000004f0cc58 1 1 0000000005095740 2fbc 53 000000011f36d320
1332 0000000004f15b38 1 1 0000000008f16710 3804 87 000000019f964728
1387 0000000004f22350 1 1 0000000008f18420 5180 92 00000001a008ab08
1515 0000000004f1d5d0 1 1 00000000052c4c30 2b5c 111 00000000ffd3c068
1594 0000000004f19bc0 1 1 000000000508ea20 188c 80 000000012012c538
1660 0000000004f13608 1 1 00000000050892f0 32fc 65 00000001df800940
1682 00000000051608a0 1 1 000000000508c740 1d58 74 00000001bfa03d20
1746 0000000004f14e88 1 1 0000000008f1c9e0 e88 104 000000015f6fcd10
1883 0000000004f19938 1 1 0000000005092e90 27c4 46 00000000ff76d2b0
1886 0000000004f1b760 1 1 0000000008f19b60 2dd4 96 000000019fc07030
2036 0000000004f1ae10 1 1 0000000008f1be40 4f58 102 00000001dfcb9da8
2042 0000000004f12e68 1 1 00000000052c8c20 2300 122 000000015f6aaa98
2049 0000000004f1cda0 1 1 00000000052c9d90 1948 126 00000001df6fd688
2153 0000000004f16d88 1 1 0000000005094ba0 3f04 51 00000000ff677eb8
2262 0000000004f13de8 3 1 00000000052ca360 6fc 127 000000011fd7a450
2358 00000000050fc390 1 1 0000000009221280 3ca0 130 0000000120055ca0
-----------------------------
Total 2553
CCW 3
RCW 2
ComClassFactory 0
Free 1212
最佳答案
SyncBlock 000000019f1ec5d8 是没有所有者的那个。也是唯一一个具有偶数 MonitorHeld
计数的。由于 MonitorHeld 递增 with 1 for the owner and 2 for each waiter我的猜测是,这是在转储被采用之前释放的资源,并且尚未授予新所有者。不公平的资源在释放时向所有服务员发出信号,服务员急于获取它(这种不公平的行为避免了护航锁)。直到服务员被调度和运行,并且第一个服务员抢到资源,才会有所有者。
另见 A high waiter count on a free critical section may indicate a lock convoy :
If you're debugging a performance problem in your application, you may run across a critical section in a very strange state: A lot of threads are waiting for it, but nobody owns it!
...
This state means that the previous owner of the critical section has just exited it and signalled a waiting thread to take it, but that thread hasn't yet gotten a chance to run yet
关于c# - .NET 线程如何等待不属于任何线程的 syncblk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7825477/
我的应用程序有一个故障转储,显示有一堆线程在等待 syncblk,而 syncblk 显示它没有拥有线程。这怎么可能?我正在尝试在测试应用程序中重现该症状,但我无法弄清楚产生该结果可能会发生什么...
首先,windbg中是否有获取每个sos命令的帮助和参数的命令? 其次,我想了解!syncblk输出 Index SyncBlock MonitorHeld Recursion Owning Thre
我正在寻找 SOS 的 !SyncBlk 命令生成的输出的描述。 特别是我在“MonitorHeld”列上找不到有用的解释。此列显示一系列故障转储中的高值。 例子: 0:000> !SyncBlk I
我是一名优秀的程序员,十分优秀!