2009-08-17 104 views
2

我有两个ManualResetEvents,我用它来在两个线程之间来回传递控制权。本质上是一个协程。如果我调用WaitHandle.Dispose(),等待线程会发生什么?

因为协程持有一次性对象(ManualResetEvents是等待句柄),它应该实现一次性。另外,它应该在处理这些ManualResetEvents时处置它们。但是,由于一次只运行一个线程,其中一个线程几乎总是等待其中一个句柄。

如果我处置两个ManualResetEvents,那么指定的行为是什么?等待的线程会永久卡住,还是会处置终止等待?如果我先调用Set(),该怎么办?

回答

0

暗示执行ManualResetEvents是一个不好的做法。 通过事件创建主管类,并使用refcounter模式(每个线程增加/减少使用)当计数器满足0时处理管理程序。

+0

我已经知道线程可以安全地处理。问题实际上是在执行处置。我需要保证没有线程死锁。 – 2009-08-17 15:11:38

+0

当您使用事件时处理事件的方式会在不同平台或不同负载的CPU上授予不可预知的行为。但应用正确的模式解决了这个问题 - 不要处置事件,而存在使用它的可能性。 – Dewfy 2009-08-17 15:57:46

0

我最近有类似的问题,并决定用监视器替换等待句柄,等待/脉冲模式由Marc Gravell herehere描述。由于监视器类是完全托管的,因此您不必担心会丢弃任何资源。当然,您仍然可能需要考虑关闭过程,但等待/脉冲模式对于添加诸如关闭标志的事物稍微灵活一些。

相关问题