Le verrouillage d'une seule variable boolean lorsque le multithreading?

Récemment, j'ai vu ce code dans un Site web, et ma question est la suivante:

        private bool mbTestFinished = false;

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

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

Dans un environnement multithread, est vraiment nécessaire pour verrouiller l'accès à la mbTestFinished?

  • Il est le plus démontrable mécanisme pour s'assurer qu'il n'est pas un CPU-en cache de lecture (qui ne fonctionne pas bien entre les threads) - volatile serait trop de travail, mais pour des raisons qui sont trop complexes (ce n'est pas l'intention de volatile, mais plutôt un effet secondaire)
  • J'ai toujours pensé que c'était l'intention de volatile; toute chance que vous pourriez déposer un bon lien qui explique ce qu'est?
  • Cette répondre on a une idée.
  • Merci! Avoir lu, il semble que c'est l'usage prévu, ou lock aussi qu'accidentellement atteint l'effet désiré, n'est-ce pas?
  • Bien en quelque sorte. Sauf que lock en fait de garantir une fraîcheur lire parce que la barrière de la mémoire s'affiche avant le lire. volatile met la barrière de la mémoire après la lecture. Je discuter de cette tangentiellement lors de l'explication de comment Thread.VolatileRead est mis en œuvre au bas de ma réponse ici.