共享对象和线程

时间:2012-12-28 01:45:58

标签: c# multithreading

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

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

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

2 个答案:

答案 0 :(得分:1)

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

示例:ReadWriteLockSlim适用于缓存,即每秒许多读取器,但每5分钟缓存一次。

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

答案 1 :(得分: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();
    }
}