这里有一个谜题给你们。我有一个多线程程序,其中一些线程使用锁和信号量等托管资源。某些锁定释放原语只能从完成锁定获取的同一线程执行。
所以这是我的难题:我包装了这些类型的操作:try { lock-acquire... do something } finally { lock-release },但有时当我的线程终止时,finally 子句由 .NET 垃圾收集线程执行,并且不是我的线程。(具体情况实际上涉及到在“using”语句中分配的对象的Dispose;详情见下文)
演示有点棘手;我一直在 Isis2 中看到它,我通过检查获取和完成块中的线程 ID 发现这是发生的。但是我没有适合你的 3 行演示,对此我很抱歉。我知道这会使提供帮助变得更容易。
有没有一种方法可以延迟线程的终止,直到与该线程关联的所有挂起的 finalize 块都已执行?
---- 为 Mark 添加了详细信息 ----
我真正在做的是一个相当复杂的自我检测锁定包,它具有各种具有线程优先级的锁定抽象(有界缓冲区、障碍、普通锁等),旨在自我检测死锁、优先级反转、非常慢的锁定授予和其他问题。我的代码足够复杂并且线程足够多,因此我需要它来调试它。
我的基本构造风格的一个例子是:
LockObject myLock = new LockObject("AnIsis2Lock");
...
using(new LockAndElevate(myLock)) { stuff }
LockObject 是一个自我监控锁...... LockAndElevate 会记录我锁定它(在这种情况下),然后在我解锁它时跟踪处置。因此,我正在利用这样一个事实,即 using 应该在块完成时处理新对象——即使它抛出异常。
我看到的是,线程经常终止,但使用 dispose 事件实际上并没有发生;他们稍后在其他线程上运行。这只发生在我的一个线程终止时;在正常执行中,整个事情就像一个魅力。
因此,由于使用 translates 来尝试... finally,我的问题是根据 finally 子句发布的。