2013-09-28 56 views
0

我有多個線程和以下使用模式之間的資源共享:簡言之釋放鎖定在.NET

  • 線程1所使用的受保護資源不斷。

  • 線程2..N需要與受保護的資源不頻繁地交互並且持續很短的時間。

我想要線程1持有鎖保護資源不斷地在特定的時間在它的工作週期屈服於其他線程等待輪到他們。如果沒有其他線程正在等待,它應該立即重新獲得鎖並繼續其工作。

我想做到這一點的一種方式是這樣的:

lock (resource) 
{ 
    while (!stop) 
    { 
     resource.DoWorkIteration(); 

     // give other threads a chance 
     Monitor.Exit(resource); 
     Thread.Sleep(0); 
     Monitor.Enter(resource); 
    } 
} 

但是睡眠(0),將屈服於任何準備運行的線程,而不是僅僅的那些等待這一特定的資源。

有沒有更好的方法來做到這一點,避免不必要的屈服?

+0

如果在Exit()和Enter()之間拋出異常並且lock塊試圖釋放無主資源,會發生什麼? –

回答

2

這是一個普遍的建議,但不是競爭資源,你應該協調對它的訪問。原因在於鎖定,解鎖和上下文切換的開銷不可忽視,並且總是存在死鎖的危險。釋放並重新獲得鎖也不是免費的,所以你最好避免它。

在你的情況,我會建議無論線程2..N需要完成資源實際上是由線程1完成。爲此,請使用存儲在隊列中的回調(最好使用非阻塞的回調)。當隊列爲空時,線程1執行它自己的操作,否則它會從隊列中彈出一個回調並執行它。如果您需要結果,請使用請求線程等待的事件。也許你也可以利用.Net用來將調用從非UI線程委託給UI元素的現有系統。