【问题标题】:Is variable assignment and reading atomic operation?变量赋值和读取是原子操作吗?
【发布时间】:2011-02-13 18:12:47
【问题描述】:

我无法在文档中找到对此的任何参考...

从线程的角度来看,分配给 double(或任何其他简单类型,包括布尔值)是否是原子操作?

double value = 0;

public void First() {
 while(true) {
  value = (new Random()).NextDouble();
 }
}

public void Second() {
 while(true) {
  Console.WriteLine(value);
 }
}

在此代码示例中,第一个方法在一个线程中调用,第二个方法在另一个线程中调用。如果第二个方法在分配给另一个线程中的变量期间执行,会得到一个混乱的值吗?

我不在乎是否收到旧值,重要的是收到一个有效值(不是设置了 8 个字节中的 2 个的值)。我知道这是一个愚蠢的问题,但我想确定一下,因为我不知道 CLR 是如何实际设置变量的。

【问题讨论】:

  • 这不是一个愚蠢的问题。
  • @EricLippert 对象 a = 10;这也是原子操作吗?我已阅读 MSDN、您的文章等。但似乎无法找到答案。因为它涉及两个步骤。拳击然后分配
  • @NoOne:变量a 的突变是原子的,因为object 是一个引用类型。拳击不参与其中。
  • @EricLippert 非常感谢 Eric。

标签: c# .net multithreading variable-assignment


【解决方案1】:

回答你的问题,不。对双打的分配并不保证是原子的。文档可用here。基本上,= 64 位类型不是。对于64位类型的原子操作,可以使用System.Threading.Interlocked上的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2011-01-18
    • 2018-01-06
    • 2021-07-06
    • 1970-01-01
    • 2016-05-20
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多