2009-08-17 79 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描述。由於監視器類是完全託管的,因此您不必擔心會丟棄任何資源。當然,您仍然可能需要考慮關閉過程,但等待/脈衝模式對於添加諸如關閉標誌的事物稍微靈活一些。

相關問題