2013-07-30 172 views
2

我對理解Mutex類如何工作有點困惑。瞭解互斥鎖類

說我有一個這樣的代碼將被多個任務執行:

bool lockAcquired = mutex.WaitOne(); 

try 
{ 
    sharedVar += 1; 
} 
finally 
{ 
    if (lockAcquired) mutex.ReleaseMutex(); 
} 

我的理解(糾正我,如果我錯了)是它達到mutex.WaitOne()那一刻,它會先等待另一個線程在繼續執行後續的語句之前執行ReleaseMutex()。因此,如果另一個線程有鎖,它將不會繼續並執行try..finally語句。如果它獲得鎖定,那麼它將繼續執行下一個代碼。那麼lockAcquired將是true。我的問題是,爲什麼我需要檢查finally語句中的lockAcquired是否爲true,如果它只在獲取鎖定時執行。這意味着finally塊中的if語句將始終執行。謝謝。

+0

'互斥'可能會非常棘手。我會強烈建議,除非你的要求是非常具體的使用'lock'和'Monitor'。這些應該滿足99%的同步需求。 – Jay

回答

1

根據the documentation,返回值是:

true如果當前實例接收的信號。如果當前實例從未發送信號,則WaitOne永不返回。

這意味着檢查返回值沒有意義,它永遠不會是false

+0

謝謝,我只是混淆了一些例子,我在調用'ReleaseMutex'前看到了返回值的檢查。 –

+0

WaitOne()的返回值可能總是爲true,但對於任何超時重載(例如WaitOne(Int32)或WaitOne(TimeSpan)),當超時時間到期時它將爲false,因此您絕對需要然後檢查它。 – SLuck49

0

沒有理由在此代碼中檢查lockAcquired。如果你要檢查它,你應該在破解互斥鎖保護的狀態之前檢查它。

+0

如果'WaitOne()'方法執行後的代碼被執行,那就意味着這個鎖被線程獲取了。如果'lockAcquired'是真的,那麼使用什麼來檢查呢? –