嗯,我的意思是我有几段代码使用了一些我想保护的变量。 但这个想法是几个线程只读取该变量。 并且只有一个线程正在写入它,并且它不那么聪明。 我希望能够让多个线程同时读取,并且只有在写入线程正在访问它时才锁定该变量。是否有可能让锁定或类似结构锁定写入?
如果我使用正常的锁(变量){}构造,那么所有的读线程将会彼此阻塞。 那么有没有办法做到这一点?
嗯,我的意思是我有几段代码使用了一些我想保护的变量。 但这个想法是几个线程只读取该变量。 并且只有一个线程正在写入它,并且它不那么聪明。 我希望能够让多个线程同时读取,并且只有在写入线程正在访问它时才锁定该变量。是否有可能让锁定或类似结构锁定写入?
如果我使用正常的锁(变量){}构造,那么所有的读线程将会彼此阻塞。 那么有没有办法做到这一点?
这听起来像你正在寻找ReaderWriterLock类。
ReaderWriterLock用于同步对资源的访问。在任何给定的时间,它允许多线程的并发读访问,或单线程的写访问。在资源不经常更改的情况下,ReaderWriterLock提供的吞吐量比简单的一次一个锁(如Monitor)的吞吐量要高。
如果你的变量是一个简单的值(一个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() { }
'ReaderWriterLock'有它的多个问题;较新的'ReaderWriterLockSlim' http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx是一个合适的替代品。 – 2009-11-15 08:25:43