Может ли общая память быть обновлена ​​в каком-то потоке, пока ее значение все еще невидимо для основного потока? - PullRequest
3 голосов
/ 04 июня 2011

Я читал эту статью о энергозависимых полях в C #.

using System;
using System.Threading;
class Test
{
   public static int result;   
   public static volatile bool finished;
   static void Thread2() {
      result = 143;    
      finished = true; 
   }
   static void Main() {
      finished = false;
      // Run Thread2() in a new thread
      new Thread(new ThreadStart(Thread2)).Start();
      // Wait for Thread2 to signal that it has a result by setting
      // finished to true.
      for (;;) {
         if (finished) {
            Console.WriteLine("result = {0}", result);
            return;
         }
      }
   }
}

Как вы можете видеть, в главном потоке есть цикл, который ожидает установки флага энергозависимости, чтобы вывести «результат», который присваивается 143, прежде чем флаг будет установлен. В объяснении говорится, что если флаг не был объявлен как volatie, то

было бы допустимо для магазина чтобы быть видимым для основного нить после магазина до конца

Я что-то здесь упустил? Даже если она не была изменчивой, программа получит распечатку 0.

1 Ответ

3 голосов
/ 04 июня 2011

Volatile предотвращает (среди прочего) переупорядочение, поэтому без volatile оно может (в некоторых случаях) в качестве граничного условия записывать их в другом порядке, позволяя флагу быть истинным, даже если результат равен 0 - длякрошечная доля времени.Тем не менее, гораздо более вероятный сценарий состоит в том, что без энергозависимости горячий цикл кэширует флаг в регистре, и никогда не завершает работу , даже если он был изменен.На самом деле, это не очень хороший способ справиться с параллелизмом, и, в частности, такая горячая петля действительно очень вредна.В большинстве распространенных случаев предпочтение отдается замку или ручке ожидания.Или Задача была бы идеальной, если вы в курсе своих версий .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...