2011-12-18 50 views
-1

正如標題所說,這是一個有效的實現嗎?我知道lock聲明的問題,但由於需求,必須使用它。這段代碼是否有效?這是線程等待/脈衝的有效實現嗎?

lock (richTextBox) 
{ 
    Monitor.Wait(richTextBox); 
    richTextBox.AppendText("Text"); 
    Monitor.PulseAll(richTextBox); 
} 
+1

你能否更詳細地解釋什麼是「這是一個有效的實施」是指?你懷疑是什麼問題導致你把代碼帶到這裏?例如,「它*編譯*」是有效代碼的一種度量。我確定它*會編譯。但是你可以用一個編譯器來解決這個問題。至於如果它正確實現了算法,你試過了嗎?它有用嗎?你遇到什麼問題? – 2011-12-18 23:20:21

+1

我認爲人們對這個問題有點苛刻,對監測儀在這裏工作的方式存在明顯的誤解,並且需要糾正。請在投票時進行評論。 – 2011-12-18 23:49:40

+0

謝謝@ MerlynMorgan-Graham對這個問題的弱點進行了有力的描述。 – 2011-12-18 23:53:37

回答

2

這個代碼是沒有意義的,因爲每個線程將在Monitor.Wait阻止,並沒有將永遠不會釋放,除非一些代碼其它塊調用Monitor.PulseAll。通常,在生產者/消費者類型場景中使用等待/脈衝(即一個或多個線程正在等待另一個線程完成一些任務或提供一些數據)。

如果你的問題是關於使用lock陳述而不是:Monitor.Enter/Monitor.Exit,那部分是好的。

根據MSDN文章:

lock(obj) { ... } 

應該是一樣的:

Monitor.Enter(obj); try { ... } finally { Monitor.Exit(obj); } 
+0

感謝您的輸入 - 我只是想澄清一下,看看我是否理解Monitor.Wait/Pulse的概念。我明白你對Wait方法的含義。 – 2011-12-18 23:20:43

+0

重要的是要明白,當Monitor.Wait被調用時,鎖被釋放,從而允許其他線程進入鎖。當調用PulseAll時,以前稱爲等待的所有線程將被釋放,但不會同時釋放,因爲只有一個線程可以一次重新獲得鎖定。當另一個線程調用Pulse/PulseAll時,一個Wait上被阻塞的線程將被移動到就緒隊列,但不會重新獲取該鎖並繼續進行,直到執行脈動的線程釋放鎖(通過退出該塊或通過調用等待自己 – 2011-12-18 23:42:50

+0

在關於監視器en.wikipedia.org/wiki/Monitor_%28synchronization%29概念的維基百科文章和關於Monitor類的MSDN文章之間:msdn.microsoft.com/en-us/library/system.threading .monitor.aspx你應​​該能夠對它們的功能有一個相當紮實的理解。 – 2011-12-19 00:11:07