2012-12-28 30 views
3

我設計了一個類MemoryBlock。就像這個名字說的那樣,它是一塊(非託管的)內存。我只是做var x = new MemoryBlock (1024, 16),它給我1kB的內存(也對齊到16字節)。所以現在一些線程想要使用不安全的上下文來讀/寫這個塊。我做了類似SyncRoot屬性來同步線程。所以我做了lock (myMemoryBlock.SyncRoot),並做了一些內存的東西。我不知道它好不好,但我在收集中看到類似的東西。
這個簡單的機制不允許多個線程訪問這個對象。可以寫作,但不足以閱讀。我想是這樣的:共享對象和線程

1)如果線程正在寫反對,沒有其他線程可以訪問這個對象
2)如果線程是從對象中讀取,許多其他的線程可以從這個對象中讀取,但不能寫它如下:
3)如果使用對象並且線程要寫入,線程將等待,直到對象空閒爲止
4)專家模式:如果某些線程正在從對象讀取,而另一個線程想要寫入對象,則等待對象免費,但也會告訴對象停止訪問想要從此對象(隊列)中讀取的新線程。

我將是簡單的技巧非常高興,而不是需要一個代碼。

+1

你可能想看看這個問題http://stackoverflow.com/questions/2116957/readerwriterlock-vs-lock – juharr

回答

1

你應該使用ReaderWriterLockSlim

下面是這個類的常見用法:

public class SomeClass 
{ 
    private MemoryBlock block = new MemoryBlock(1024, 16); 

    private ReaderWriterLockSlim blockSyncObjcect = new ReaderWriterLockSlim(); 

    public void SomeRead() 
    { 
     blockSyncObjcect.EnterReadLock(); 

     // Safe reading from the block 

     blockSyncObjcect.ExitReadLock(); 
    } 

    public void SomeWrite() 
    { 
     blockSyncObjcect.EnterWriteLock(); 

     // Safe writing to the block 

     blockSyncObjcect.ExitWriteLock(); 
    } 
}