嗯,我的意思是我有幾段代碼使用了一些我想保護的變量。 但這個想法是幾個線程只讀取該變量。 並且只有一個線程正在寫入它,並且它不那麼聰明。 我希望能夠讓多個線程同時讀取,並且只有在寫入線程正在訪問它時才鎖定該變量。是否有可能讓鎖定或類似結構鎖定寫入?
如果我使用正常的鎖(變量){}構造,那麼所有的讀線程將會彼此阻塞。 那麼有沒有辦法做到這一點?
嗯,我的意思是我有幾段代碼使用了一些我想保護的變量。 但這個想法是幾個線程只讀取該變量。 並且只有一個線程正在寫入它,並且它不那麼聰明。 我希望能夠讓多個線程同時讀取,並且只有在寫入線程正在訪問它時才鎖定該變量。是否有可能讓鎖定或類似結構鎖定寫入?
如果我使用正常的鎖(變量){}構造,那麼所有的讀線程將會彼此阻塞。 那麼有沒有辦法做到這一點?
這聽起來像你正在尋找ReaderWriterLock類。
ReaderWriterLock用於同步對資源的訪問。在任何給定的時間,它允許多線程的併發讀訪問,或單線程的寫訪問。在資源不經常更改的情況下,ReaderWriterLock提供的吞吐量比簡單的一次一個鎖(如Monitor)的吞吐量要高。
如果你的變量是一個簡單的值(一個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() { }
'ReaderWriterLock'有它的多個問題;較新的'ReaderWriterLockSlim' http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx是一個合適的替代品。 – 2009-11-15 08:25:43