這是一個理論問題;我沒有真正需要解決的問題,我只是想了解這種方式背後的推理。爲什麼ReaderWriterLock在所有者線程終止時不會自動釋放/退出?
我發現,如果一個線程省略以退出ReaderWriterLock,那麼即使在原始線程終止後,其他線程也將無法獲得鎖。當擁有鎖的線程終止時,ReaderWriterLock不會將鎖授予等待的線程是否有充分的理由?
這是一個演示問題的測試案例。
static void Main(string[] args)
{
ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
Thread t1 = new Thread((a) =>
{
readerWriterLock.EnterReadLock();
// this thread omits to Exit the lock....
});
Thread t2 = new Thread((a) =>
{
readerWriterLock.EnterWriteLock();
});
t1.Start();
t2.Start();
// wait for all threads to finish
t1.Join();
t2.Join();
}
在一個線程崩潰的情況下,我同意假設它被鎖定的資源現在處於一個乾淨的狀態將是有風險的。但在正常線程終止的情況下,我認爲這樣的假設是安全的。關於性能,他們可以提供兩種實現:我們現在擁有的實現,以及實現自動發佈的更慢但更智能的實現。無論如何,謝謝你的回答,我認爲你解釋的確是這樣做的原因。 – Sylvain 2010-02-11 13:07:39
回覆:正常的線程終止,你可以考慮使用RAII模式來鎖定,這有助於確保在退出某個範圍時釋放鎖定。在C#中,可以使用_lock_關鍵字(用於常規鎖)或_try/finally_ blocks(用於ReaderWriterLock)來確保在範圍退出時釋放鎖。再說一次,如果線程崩潰了,或者它調用了一些較低級別的線程退出函數,這不會對您有所幫助,但它將有助於降低編程錯誤導致死鎖的風險,因爲您忘記在某些複雜的代碼路徑上釋放鎖。 – 0xfe 2010-02-11 13:22:07