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