Dan*_*lba 24 .net c# multithreading locking
最近我在WebSite中看到了这段代码,我的问题如下:
private bool mbTestFinished = false;
private bool IsFinished()
{
lock( mLock )
{
return mbTestFinished;
}
}
internal void SetFinished()
{
lock( mLock )
{
mbTestFinished = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在多线程环境中,是否真的有必要锁定访问权限mbTestFinished
?
dar*_*yal 11
是的,这是必要的..Net环境使用一些优化,有时如果频繁访问内存位置,数据将被移入CPU寄存器.因此,在这种情况下,如果mbTestFinished位于CPU寄存器中,则读取它的线程可能会得到错误的值.因此,使用volatile键确保对该变量的所有访问都在存储器位置完成,而不是在寄存器中完成.另一方面,我不知道这种情况发生的频率.这可能以非常低的频率发生.
Tud*_*dor 10
在我看来,不,这里的锁是多余的,原因有两个:
long
例如,布尔变量不会导致分配撕裂,因此不需要锁定.volatile
就足够了.确实,lock
引入了隐式栅栏,但由于lock
原子性不是必需的,因此volatile
就足够了.小智 5
如果mLock 仅适用于变量mbTestFinished,那么它有点过分.相反,您可以使用volatile或Interlocked,因为两者都是用于线程同步的用户模式构造.lock(或Monitor)是一种混合构造,在某种意义上它是经过优化的,可以尽可能避免从内核模式转换到内核模式."CLR via C#"一书对这些概念进行了深入的讨论.