数组是否在C#中写入原子?

joe*_*joe 5 c# arrays atomic

var a = new bool[]{true,false};
var b = new bool[4];
a=b;       //operation 1
a[1]=true; //operation 2
Run Code Online (Sandbox Code Playgroud)

我知道在C#中定义了一些atmoic类型,从那里我找不到数组.

  1. 操作1类似于指针重新分配.它是否 保证是有毒的?
  2. 操作2怎么样?

Joe*_*orn 5

操作1是原子的。操作2不是。从规格

5.5变量引用的原子性

下列数据类型的读写是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和引用类型。此外,上一个列表中具有基础类型的枚举类型的读取和写入也是原子的。不保证其他类型的读取和写入(包括long,ulong,double和decimal)以及用户定义的类型都是原子的。

数组是引用类型。变量ab是引用,因此操作1是引用赋值:对引用变量的简单写入,因此也包含在内。操作2 看起来像是对的简单写入bool,也将包括在内,但是不要忘记数组中的索引查找。数组写入本身原子的,但是当您包含查找(dereferencing a[1])时,涉及两个单独的操作。

  • 这里的评论有些混乱。共有三个操作:获得a的值,获得该数组的[1]处的变量,并将true赋给该变量。可以观察到其他线程上的任何操作都与这些操作交织在一起,但是谁在乎呢?如果我们处于这种情况,那么问题就不在于操作的原子性。问题是在写之前或之后,`a`可能会在另一个线程上发生突变,因此我们面临一个竞争条件,程序必须消除该条件或使其具有鲁棒性。 (2认同)