2012-12-28 210 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(); 
    } 
}