3

我设计了一个类MemoryBlock。就像名字所说的那样,它是一块(非托管)内存。我只是这样做var x = new MemoryBlock (1024, 16),它给了我 1kB 的内存(也对齐到 16 个字节)。所以现在一些线程想要使用不安全的上下文读/写这个块。我做了类似SyncRoot属性的事情来同步线程。所以我lock (myMemoryBlock.SyncRoot)用记忆做一些事情。我不知道它好不好,但我在收藏中看到了这样的东西。
这种简单的机制不允许多个线程访问该对象。写作可以,但阅读不够。我想要这样的东西:

1)如果线程正在写入对象,则没有其他线程可以访问该对象
2)如果线程正在从对象读取,许多其他线程可以从该对象读取,但不能写入它
3)如果使用对象并且线程要写入, 线程等待直到对象空闲
4) 专家模式:如果一些线程正在读取对象,而另一个线程想要写入它,它会等待直到对象空闲但也告诉对象停止允许访问要读取的新线程从这个对象(队列)。

我会很高兴得到简单的提示,不需要代码。

4

2 回答 2

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();
    }
}
于 2012-12-28T02:32:13.523 回答
1

看看ReaderWriterLockSlim。基本上它有利于许多读者需要同时阅读但任何作家都应该阻止所有读者的情况。如果您的读/写比率为 50:50,则使用常规 lock(obj){}

示例:ReadWriteLockSlim 适用于缓存,即每秒有许多读者,但缓存每 5 分钟更新一次。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

于 2012-12-28T02:13:23.193 回答