CIL指令是原子的吗?

时间:2011-01-18 12:55:12

标签: .net multithreading cil

.Net运行时是否对CIL指令的原子性做出任何保证?如果是这样,他们是什么?所有CIL指令都是原子的吗?或者它是否依赖于JIT编译器生成的机器代码的原子性,因此太平台特定于做出任何保证?

1 个答案:

答案 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位,这是它可以提供的最大保证。