2016-03-02 28 views
0

我需要同時允許多個寫入器/單個讀取器。我發現ReaderWriterLockSlim類,但我有一個命名問題。我需要使用EnterReadLock()來允許寫入者寫入,而EnterWriteLock()允許讀者寫入,這對於進一步的使用可能有點混亂。使用ReaderWriterLockSlim在讀寫器的對面

ReaderWriterLockSlim類是否有針對我的問題的包裝類,或者您能否提出其他解決方案?

謝謝!

+0

*多個作家/單讀者*你必須堅持'鎖定'。 –

+0

你在保護什麼資源,以便有多個作者是安全的?如果只有一個閱讀器,爲什麼你需要一個鎖? –

回答

0

如果您可以使用.Net 4.5或更高版本,我推薦使用Task Parallel Library'sBufferBlock類。 (您可以通過Nuget安裝TPL。)

有關示例代碼,請參閱herehere

或者,您也可以使用由.Net 4.0或更高版本支持的BlockingCollection

這兩個類使得在多個作者和單個閱讀器之間共享一個隊列變得相對容易。

+1

重要的是要注意,即使BlockingCollection的每個方法都是線程安全的,多次調用BlockingCollection的操作也不會是原子操作,因此用戶仍然需要使用額外的鎖定模型或不同的編碼模型來模擬訪問對象的多個方法時的原子操作。順便說一句,像BlockingCollection和ConcurrentDictionary這樣的集合具有與check-then-perform模型一起工作的方法,就像在某種條件滿足(原子性)時試圖消除我剛剛描述的問題一樣。 – m1o2

0

這是你在找什麼?儘管我建議你堅持使用常規的命名約定,使其更容易從另一個人更新。

class MyReaderWriterLockSlim: ReaderWriterLockSlim 
{ 
    new public void EnterWriteLock() 
    { base.EnterReadLock(); } 

    new public void EnterReadLock() 
    { base.EnterWriteLock(); } 

    new public void ExitReadLock() 
    { base.ExitWriteLock(); } 

    new public void ExitWriteLock() 
    { base.ExitReadLock(); } 
} 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     MyReaderWriterLockSlim myLock=new MyReaderWriterLockSlim(); 
     myLock.EnterReadLock(); 
     try 
     { 
      //do stuff 
     } 
     finally 
     { myLock.ExitReadLock(); } 
    } 
} 
相關問題