C# 中的数组写入是原子的吗?
Is array write atomic in C#?
var a = new bool[]{true,false};
var b = new bool[4];
a=b; //operation 1
a[1]=true; //operation 2
我知道在 C# 中定义了一些 atmoic 类型,但我找不到数组。
- 操作 1 类似于指针重新分配。可以
保证大气?
- 操作2怎么样?
操作 1 是原子操作。操作 2 不是。来自 the spec:
5.5 Atomicity of variable references
Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic.
数组是引用类型。变量 a
和 b
是引用,因此操作 1 是引用赋值:对引用变量的简单写入,因此包含在内。操作 2 看起来像 对 bool
的简单写入,也将包含在内,但不要忘记数组中的索引查找。数组写入自身 是 原子的,但是当您包含查找(取消引用 a[1]
)时,涉及两个单独的操作。
也许我不对,但在我看来 a[1]=true;
操作不是原子的,
根据规范,=true
看起来像原子的,但在整体(a[1]=true;
)操作期间,我们需要从数组中获取 1 个元素,然后将其设置为 true
的值
var a = new bool[]{true,false};
var b = new bool[4];
a=b; //operation 1
a[1]=true; //operation 2
我知道在 C# 中定义了一些 atmoic 类型,但我找不到数组。
- 操作 1 类似于指针重新分配。可以 保证大气?
- 操作2怎么样?
操作 1 是原子操作。操作 2 不是。来自 the spec:
5.5 Atomicity of variable references
Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic.
数组是引用类型。变量 a
和 b
是引用,因此操作 1 是引用赋值:对引用变量的简单写入,因此包含在内。操作 2 看起来像 对 bool
的简单写入,也将包含在内,但不要忘记数组中的索引查找。数组写入自身 是 原子的,但是当您包含查找(取消引用 a[1]
)时,涉及两个单独的操作。
也许我不对,但在我看来 a[1]=true;
操作不是原子的,
根据规范,=true
看起来像原子的,但在整体(a[1]=true;
)操作期间,我们需要从数组中获取 1 个元素,然后将其设置为 true