C#线程安全:在一个线程中读取变量,而在另一个线程中更新该变量会导致意外行为吗?

时间:2018-10-15 05:13:58

标签: c# multithreading thread-safety locking

以该程序为例:

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 :(得分:2)

要回答您的问题,是的,这是可能的;当其他线程读取该值时,double中的某些字节可能会更新,因此将包含损坏的数据。

如果您对自动读写方式感兴趣,但又不使用lock,建议您看看Interlocked类,它支持一组有限的原子操作。

另请参阅c# interlocked methods as a locking mechanism?