2013-07-04 82 views
1

我想要做的就是在多個線程上訪問List。這是線程安全的,所以我可以不用擔心。唯一的問題是,偶爾我必須修改List。所以,我想阻止其他線程僅在修改時才使用List並行線程安全列表訪問和修改

這就是我在想什麼,有沒有更好的方法?

volatile bool isReading = false; 
volatile bool isWriting = false; 
object o = new object(); 
public void StartRead() 
{ 
    lock (o) 
    { 
     while (isWriting || isReading) ; 
     isReading = true; 
    } 
} 
public void StopRead() 
{ 
    isReading = false; 
} 
public void StartWrite() 
{ 
    lock (o) 
    { 
     while (isReading) ; 
     isWriting = true; 
    } 
} 
public void StopWrite() 
{ 
    isWriting = false; 
} 

回答

3

更好的解決方案是使用ReaderWriterLockSlim。這可以讓你同時擁有很多讀者,但只有在有作家的時候纔會鎖定它。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

這真的取決於到底有多少的競爭沒有爲鎖雖然。在低爭用情況下,lock將執行類似於ReaderWriterLockSlim - 參考When is ReaderWriterLockSlim better than a simple lock?

這個問題有很多可能的解決方案,具體取決於它的使用方法。但是,在簡單的「面值」情況下,ReaderWriterLockSlim是一個體面的解決方案。如果性能分析後它不適用於您,則可能需要其他解決方案來滿足您的特定使用場景。

+0

完美!我沒有意識到System.Threading中有這麼多。 – Jay