c# - 变量赋值和读取是原子操作吗?

标签 c# .net multithreading variable-assignment

我无法在文档中找到对此的任何引用...

从线程的角度来看,给 double(或任何其他简单类型,包括 bool 值)赋值是原子操作吗?

double value = 0;

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

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

在此代码示例中,第一个方法在一个线程中调用,第二个方法在另一个线程中调用。如果在另一个线程中对变量赋值期间执行第二个方法,它会得到一个困惑的值吗?

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

最佳答案

回答你的问题,没有。不保证对 double 的分配是原子的。文档可用 here .基本上,<= 32 位内置类型是原子的,>= 64 位类型不是。对于 64 位类型的原子操作,您可以使用 System.Threading.Interlocked 上的方法

关于c# - 变量赋值和读取是原子操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2736541/

相关文章:

c# - 从相对路径获取绝对URL(重构方法)

c# - C# 中的修剪函数

c# - 与宽高比匹配的最小尺寸

c++ - 此多线程用例的最佳数据结构 : Is Intrusive List good?

c - 多线程光线追踪

c# - 将 z-index 添加到窗口

.net - 接收从网页拖动到 WPF 窗口的图像

.net - 关于构造函数的代码分析警告

C#线程问题

c# - 为对象属性分配值