数组写入是C#中的原子吗?

数组写入是C#中的原子吗?,c#,arrays,atomic,C#,Arrays,Atomic,我知道在C#中定义了一些atmoic类型,从中我找不到数组 操作1类似于指针重新分配。是吗 保证成为atmoic 第二次行动怎么样 操作1是原子的。操作2不可用。发件人: 5.5变量引用的原子性 以下数据类型的读写是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float和引用类型。此外,前面列表中具有基础类型的枚举类型的读写也是原子的。其他类型(包括long、ulong、double和decimal)以及用户定义类型的读写不保证是原子的 数组是引

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

  • 操作1类似于指针重新分配。是吗 保证成为atmoic
  • 第二次行动怎么样

  • 操作1是原子的。操作2不可用。发件人:

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


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

    也许我不对,但在我看来
    a[1]=true操作不是原子的,
    
    根据规范,
    =true
    看起来像原子,但在整个(
    a[1]=true;
    )操作过程中,我们需要从数组中获取1个元素,然后将其设置为
    true

    的值,我从未见过任何对这两种操作都不适用的操作。具体请看规范。你能展示一些代码来说明不是原子的坏结果吗?我相信2确实是原子的。规范之前的一小节将变量引用定义为“左值”表达式,之后使用变量引用标识符定义可能用作引用参数的表达式。数组元素被允许作为ref参数,这表明它们是本节所述的变量引用。@LeiYang我不相信自己能正确获得它。。。或者更确切地说,“错了”,这取决于你的观点:)。只有当两个线程处理同一个值时,才能看到问题所在,而让代码来演示这一点是很棘手的。@mikez赋值本身是原子的,但这对整个语句来说都是一个难题。这里的注释有些混乱。有三种操作:获取
    a
    的值,获取该数组的
    [1]
    处的变量,并将
    true
    赋值给该变量。其他线程上的任何操作都可能与这些操作交织在一起,但谁在乎呢?如果我们处于这种情况,那么问题不在于操作的原子性;问题是,
    a
    可能在写入之前或之后在另一个线程上发生变异,因此我们有一个竞争条件,程序必须消除该条件或对其具有鲁棒性。请不要在已经有公认的正确答案的问题上发布答案。此答案不添加已接受答案中尚未添加的内容。
    var a = new bool[]{true,false};
    var b = new bool[4];
    a=b;       //operation 1
    a[1]=true; //operation 2