Блокировка одной переменной bool при многопоточности? - PullRequest
23 голосов
/ 30 марта 2012

Недавно я видел этот код на веб-сайте, и у меня следующий вопрос:

        private bool mbTestFinished = false;

        private bool IsFinished()
        {
            lock( mLock )
            {
                return mbTestFinished;
            }
        }

        internal void SetFinished()
        {
            lock( mLock )
            {
                mbTestFinished = true;
            }
        }

В многопоточной среде действительно необходимо заблокировать доступ к mbTestFinished?

Ответы [ 3 ]

10 голосов
/ 30 марта 2012

Да, это необходимо.Среда .Net использует некоторые оптимизации, и иногда, если к ячейке памяти обращаются часто, данные перемещаются в регистры ЦП.Таким образом, в этом случае, если mbTestFinished находится в регистре процессора, то поток, читающий его, может получить неправильное значение.Таким образом, использование энергозависимого ключа гарантирует, что все обращения к этой переменной осуществляются в ячейке памяти, а не в регистрах.С другой стороны, я понятия не имею о частоте этого происшествия.Это может происходить с очень низкой частотой.

10 голосов
/ 30 марта 2012

На мой взгляд, нет, блокировка здесь избыточна по двум причинам:

  1. Булевы переменные не могут вызвать разрыв присваивания, например, long, следовательно, блокировка не нужна.
  2. Чтобы решить проблему видимости, достаточно volatile.Это правда, что lock вводит неявный забор, но поскольку lock не требуется для атомарности, достаточно volatile.
5 голосов
/ 30 марта 2012

Если mLock равен ТОЛЬКО для переменной mbTestFinished , то это немного излишне.Вместо этого вы можете использовать volatile или Interlocked , поскольку оба являются конструкциями пользовательского режима для синхронизации потоков. lock (или Monitor ) представляет собой Hybrid Construct , в том смысле, что он хорошо оптимизирован, чтобы избежать перехода из / в Kernel-Mode когда бы ни было возможно.В книге "CLR via C #" подробно обсуждаются эти концепции.

...