是否可以让lock {}或类似结构仅锁定写入?

时间:2009-11-15 07:33:16

标签: c# multithreading synchronization

我的意思是我有几段代码使用了一些我想要保护的变量。 但想法是几个线程只读取该变量。 并且只有一个线程正在写入它并且它不那么频繁。 我希望能够让多个线程同时读取,并且只在写入线程访问它时才锁定此variantbe。

如果我使用普通的锁(变量){}构造,那么所有的读取线程将相互阻塞。 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

听起来你正在寻找ReaderWriterLock班。

  

ReaderWriterLock用于同步对资源的访问。在任何给定时间,它允许多个线程的并发读访问,或单个线程的写访问。在资源不经常更改的情况下,ReaderWriterLock提供比简单的一次性锁定(例如Monitor)更好的吞吐量。

答案 1 :(得分:1)

如果你的变量是一个简单的值(一个int),你可以使用System.Threading.Interlocked,如下所示:

int counter = 0;
void Worker1()
{        
    if (counter < 5)  // read is safe
    {
        Interlocked.Increment(ref counter); // write
        // ...
    }            
}

备注

  • counter执行not has to be volatile
  • 如果您长时间使用,请使用Interlocked.Read()
  • 阅读
  • 如果您的'变量'是对象,请使用ReaderWriterLockSlim或者只是坚持使用lock() { }