通知编译器可能从另一个线程更新变量

时间:2015-12-27 20:36:54

标签: c# .net

通常使用volatile来完成。但是如果longdouble是不可能的话。

也许只是让它public就足够了,然后编译器知道这可以被另一个程序集使用而不会“优化它”?这可以依靠吗?其他一些方式?

要清楚,我并不担心同时读/写变量。只有一件事 - 它没有得到优化。 (比如https://stackoverflow.com/a/1284007/939213。)

1 个答案:

答案 0 :(得分:0)

防止代码删除的最佳方法是使用代码。

如果你担心在你的例子中优化while循环

class Test  
{
   long foo;

   static void Main()
   {
      var test = new Test();

      new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start();

      while (test.foo != 255) ;
      Console.WriteLine("OK");
   }
}

你仍然可以使用volatile来修改你的while循环

volatile int temp;

//code skipped in this sample
while(test.foo != 255) { temp = (int)foo;}

现在假设您确定没有任何线程安全问题。你正在使用你的长foo,所以它不会被优化掉。因为你只是想让它保持活力,所以你不必担心失去任何一部分时间。

如果您执行此类操作,请务必清楚地标记代码。可能写一个包装你的long(和你的volatile int)的VolatileLong类,以便其他人了解你在做什么

其他线程安全工具(如锁)也会阻止代码删除。例如,编译器足够智能,不会像这样在sinleton模式中删除double。

if (_instance == null) {
  lock(_lock) {
       if (_instance == null) { 
          _instance = new Singleton();
        }
   }
}
return _instance;