多线程时锁定单个bool变量?

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

在我看来,不,这里的锁是多余的,原因有两个:

  1. long例如,布尔变量不会导致分配撕裂,因此不需要锁定.
  2. 解决可见性问题volatile就足够了.确实,lock引入了隐式栅栏,但由于lock原子性不是必需的,因此volatile就足够了.


小智 5

如果mLock 适用于变量mbTestFinished,那么它有点过分.相反,您可以使用volatileInterlocked,因为两者都是用于线程同步的用户模式构造.lock(或Monitor)是一种混合构造,在某种意义上它是经过优化的,可以尽可能避免从内核模式转换到内核模式."CLR via C#"一书对这些概念进行了深入的讨论.