【发布时间】:2014-01-16 08:46:47
【问题描述】:
我有两个线程。线程 1 定期挂起线程 2 以收集一些统计信息。线程 1 需要为这些统计信息分配内存,而另一个线程被挂起。由于挂起的线程可能持有堆锁,如果线程 1 从同一堆分配内存,则可能发生死锁。
可能的解决方案:为线程 1 使用私有堆以避免死锁。
如果必须增加私有堆的大小会怎样?必须再次存在某种全局锁,将内存页面分配到堆同步。所以在我的理解中,如果线程 2 在挂起期间持有这个全局锁,仍然有可能导致死锁。这是正确的还是使用一些特殊的“无锁原子”机制完成全局内存管理?
编辑:
线程 2 可能被 CLR 垃圾收集器或我自己调用 SuspendThread 挂起。通过调用HeapCreate 创建一个私有堆。
【问题讨论】:
-
如何挂起线程?
-
请查看已编辑的问题。
-
这就是为什么 SuspendThread() 是邪恶的并且在 .NET Framework 中具有 [Obsolete] 属性的原因。不要使用它。
-
我正在编写一个小型 .NET 分析器,我必须(!)挂起线程。我使用的是 windows api SuspendThread 函数,而不是托管函数。