我的意思是我有几段代码使用了一些我想要保护的变量。 但想法是几个线程只读取该变量。 并且只有一个线程正在写入它并且它不那么频繁。 我希望能够让多个线程同时读取,并且只在写入线程访问它时才锁定此variantbe。
如果我使用普通的锁(变量){}构造,那么所有的读取线程将相互阻塞。 有没有办法做到这一点?
答案 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() { }