2009-11-15 69 views
1

嗯,我的意思是我有幾段代碼使用了一些我想保護的變量。 但這個想法是幾個線程只讀取該變量。 並且只有一個線程正在寫入它,並且它不那麼聰明。 我希望能夠讓多個線程同時讀取,並且只有在寫入線程正在訪問它時才鎖定該變量。是否有可能讓鎖定或類似結構鎖定寫入?

如果我使用正常的鎖(變量){}構造,那麼所有的讀線程將會彼此阻塞。 那麼有沒有辦法做到這一點?

回答

5

這聽起來像你正在尋找ReaderWriterLock類。

ReaderWriterLock用於同步對資源的訪問。在任何給定的時間,它允許多線程的併發讀訪問,或單線程的寫訪問。在資源不經常更改的情況下,ReaderWriterLock提供的吞吐量比簡單的一次一個鎖(如Monitor)的吞吐量要高。

+7

'ReaderWriterLock'有它的多個問題;較新的'ReaderWriterLockSlim' http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx是一個合適的替代品。 – 2009-11-15 08:25:43

1

如果你的變量是一個簡單的值(一個int),你可以使用System.Threading.Interlocked,像這樣:

int counter = 0; 
void Worker1() 
{   
    if (counter < 5) // read is safe 
    { 
     Interlocked.Increment(ref counter); // write 
     // ... 
    }    
} 

  • counter確實not has to be volatile
  • 如果您使用長,讀取Interlocked.Read()
  • ,如果你的「變量」是一個對象,使用ReaderWriterLockSlim或者只是堅持lock() { }