有没有知道在C#中的操作是否是原子或没有一种系统的方式? 还是有什么一般准则或经验法则?
Answer 1:
对于一些更完整/详细:
读取和写入32位值的类型是原子:这包括以下内在价值(结构)类型: bool, char, byte, sbyte, short, ushort, int, uint, float
。 以下类型(其中包括)不能保证是原子的: decimal, double, long, ulong
。
如
int x;
x = 10; // atomic
decimal d;
d = 10m; // not atomic
参考分配也是一个原子操作:
private String _text;
public void Method(String text)
{
_text = text; // atomic
}
Answer 2:
是。 阅读CLI规格: http://www.ecma-international.org/publications/standards/Ecma-335.htm 。 例如:
I.12.6.6原子的读取和写入
一个符合CLI须保证读取和写入访问正确对齐的内存位置并不比本地字大小(原始类型为int的大小)是原子(见§I.12.6.2)当所有的写访问的位置是大小相同。 原子写入应改变比写其他的位。 除非明确的布局控制(请参阅分区II(控制实例布局))来改变默认行为,数据元素没有比自然字长(原生INT的大小)应正确对齐。 就好像它们存储在本机字长对象引用应进行治疗。
[注:没有关于原子更新(读 - 修改 - 写)的存储器中,除了提供用于此目的作为类库的一部分的方法(请参阅分区IV)的保证。 “小数据项”(一个项目不超过本地字大小)的原子写入需要做原子读取/修改/上不支持直接写入到小数据项硬件写。 注完]
[注:有8个字节的数据没有保证的原子访问时天然int的长度为32位,即使当该数据被一个8字节的边界上对齐一些实现方式中可能执行的原子操作。 注完]
关于64位长的问题,埃里克利珀这里回答它: http://blogs.msdn.com/b/ericlippert/archive/2011/05/31/atomicity-volatility-and-immutability-are-different-part- two.aspx
该CLI规范实际上使更强的保证。 该CLI保证读取和的是处理器的自然指针大小的尺寸(或更小)是原子的值的变量类型写入; 如果你是一个64位操作系统上的CLR的64位版本上运行的C#代码,然后读取和64个双打写和长整数,也保证是原子。 C#语言并不能保证,但运行不规范。 (如果您正在运行在某些环境中不被CLI的一些实现来实现C#代码,那么你当然不能依靠这样的保证;联系,如果你想知道什么保证他们提供的谁卖给你运行的供应商。)
关于原子访问另一个细微点是正被读出或写入与被对准以在存储器中的右位置存储相关联的变量时底层处理器只保证原子性。 最终变量将被某处实现为指针存储器。 在32位操作系统,该指针必须是由4整除,以使读或写操作被保证是原子,和一个64位操作系统上它必须是由8整除。
Answer 3:
从CLI规格就可以得到在这里 :
“A符合CLI须保证读取和写入访问正确对齐的内存位置并不比本地字大小(原始类型为int的大小)是原子的...”
12.5节从C#规格在这里 :
“读取及以下数据类型的读写应原子:布尔,字符,字节,为sbyte,短,USHORT,UINT,INT,float和引用类型。”又道:“......没有保证原子读 - 修改 - 写,例如在增量或减量的情况下“。
把增加操作原子与此 。