Безопасность потока C #: может ли чтение переменной в одном потоке, В то время как обновление этой переменной в другом, привести к неожиданному поведению? - PullRequest
0 голосов
/ 15 октября 2018

Возьмем эту программу в качестве примера:

class Program
{
   public static double myVar1 = 0;
   public static double myVar2 = 0;

   static void Main()
   {
      Thread thread1 = new Thread(new ThreadStart(update_variable));
      thread1.Start();

      while (true)
      {
         myVar2 = myVar1;
      }
   }

   static update_variable()
   {
      while (true)
      {
         myVar1 = 2222222.22;
         myVar1 = 1111111.11;
      }
   }
}

Возможно ли, чтобы myVar2 равнялся значению, отличному от 222222.22 или 1111111.11?Другими словами, изменились ли байты для переменной «все или ничего» или основной поток мог увидеть myVar1 в момент времени, когда некоторые байты изменились, а другие нет, что дало неожиданное значение?

Я протестировал вышеупомянутую программу и не вижу такого поведения, но мне интересно, возможно ли это и будет ли это рассматриваться как потокобезопасный код.Я бы предпочел не использовать ресурсы блокировки, поскольку у меня есть только один поток, который изменяет данные, и один, который использует данные.

1 Ответ

0 голосов
/ 15 октября 2018

Ответить на ваш вопрос, да, это возможно;некоторые байты в double могут обновляться, когда другой поток читает значение, поэтому будут содержать поврежденные данные.

Если вас интересуют способы атомарного чтения и записи, но без использования lock,Я предлагаю вам взглянуть на класс Interlocked , который поддерживает ограниченный набор атомарных операций.

См. Также c # блокированные методы как механизм блокировки? .

...