C# 规范(ECMA-334和ISO/IEC 23270)有一段关于读写的原子性:
12.5 变量引用的原子性
以下数据类型的读取和写入应是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float 和引用类型。此外,具有上一个列表中的基础类型的枚举类型的读取和写入也应该是原子的。其他类型的读取和写入,包括 long、ulong、double 和 decimal,以及用户定义的类型,不必是原子的。
但我很难想象这总是正确的。例如,我可以使用StructLayout
属性布局结构,并强制字段不对齐:
// sizeof(MyStruct) == 9
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
public byte pad; // Offset: 0
public int value1; // Offset: 1
public int value2; // Offset: 5
}
现在当我这样做时,我会认为对 的写入int
不是原子的,因为它没有与自然边界对齐:
MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
那么,它绝对是原子的(就像规范所说的那样),还是不能保证是原子的(例如在 x86 上)?无论哪种方式,您是否有任何来源支持这一点?