是否有一种系统性的方法能够知道C#中的操作是否是原子操作?或者有任何一般性的指南或经验法则吗?
如果需要更完整/详细的信息:
读写32位值类型是原子性的:这包括以下内在值(struct)类型: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
}
关于64位长整型问题,Eric Lippert在这里回答了它: https://ericlippert.com/2011/05/31/atomicity-volatility-and-immutability-are-different-part-two/
CLI规范实际上提供了更强的保证。CLI保证对于值类型变量的读写是原子性的,如果这些变量的大小(或更小)等于处理器的自然指针大小;如果在64位版本的CLR中运行C#代码,则64位双精度和长整型的读写也保证是原子性的。C#语言并不保证这一点,但运行时规范确实保证了。 (如果在某些没有由CLI的某些实现实现的环境中运行C#代码,则当然不能依赖该保证;如果想知道他们提供的保证,请联系售卖给你运行时的供应商。)