.Net运行时是否对CIL指令的原子性做出任何保证?如果是这样,他们是什么?所有CIL指令都是原子的吗?或者它是否依赖于JIT编译器生成的机器代码的原子性,因此太平台特定于做出任何保证?
答案 0 :(得分:8)
C#规范谈到了这一点,同样的事实也基本适用于CIL;基本上,所有最多4个字节的整数类型都是原子保证的,任何引用读/写都是保证原子的。
但是,除此之外没有任何保证; <{1}}不保证是原子的,例如 - double
可能会有所帮助。
引用ECMA 335(公共语言基础结构(CLI)分区I到VI)
12.6.6原子读写
符合要求的CLI应保证 正确读写访问权限 对齐的内存位置不大 比原始单词大小(的大小) type native int)是原子的(参见 §12.6.2)所有写访问时 到一个位置是相同的大小。 原子写入不会改变位 除了那些写的。除非 显式布局控制(见 分区II(控制实例 Layout))用于更改默认值 行为,数据元素不大 比自然字大小(大小 一个原生的int)应该是正确的 对齐。对象引用应为 对待它们就好像存放在 原生单词大小。
[注意:有 不保证原子更新 (读 - 修改 - 写)内存,除了 为此目的提供的方法 作为类库的一部分(参见 分区IV)。一个原子写的 - 小数据项‖(项目不大 比原始单词大小)是必需的 做原子读/修改/写 不支持直接的硬件 写入小数据项。结束说明]
[注意:没有保证的原子 当大小时访问8字节数据 尽管如此,native int是32位 一些实现可能会执行 数据时的原子操作 在8字节边界上对齐。结束 音符]
由于Interlocked
必须至少 32位,这是它可以提供的最大保证。