2009-11-15 66 views
1

嗯,我的意思是我有几段代码使用了一些我想保护的变量。 但这个想法是几个线程只读取该变量。 并且只有一个线程正在写入它,并且它不那么聪明。 我希望能够让多个线程同时读取,并且只有在写入线程正在访问它时才锁定该变量。是否有可能让锁定或类似结构锁定写入?

如果我使用正常的锁(变量){}构造,那么所有的读线程将会彼此阻塞。 那么有没有办法做到这一点?

回答

5

这听起来像你正在寻找ReaderWriterLock类。

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

+7

'ReaderWriterLock'有它的多个问题;较新的'ReaderWriterLockSlim' http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx是一个合适的替代品。 – 2009-11-15 08:25:43

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() { }