以下代码是否安全(考虑它在隔离状态下)以避免 torn read?
以下代码是否安全(考虑它在隔离状态下)以避免 torn read?
然而,在读取方面,我是否还需要一个“镜像”操作?例如,如果我不以原子方式读取值,仍然有获取损坏数据的风险吗?
我的直觉是不需要,因为我认为另一个内存访问(例如读取)不能与任何其他原子操作同时发生,即使该其他访问本身不是原子操作。但我想得到一些确认!
以下代码是否安全(考虑它在隔离状态下)以避免 torn read?
private static double flopsErrorMargin = 0.01d;
public static double FlopsErrorMargin {
get {
double result = flopsErrorMargin;
Thread.MemoryBarrier();
return result;
}
set {
Interlocked.Exchange(ref flopsErrorMargin, value);
}
}
Interlocked.Exchange()
是原子写操作,因为在.NET平台上(除了64位环境的实现细节)不能保证double类型能够在单个操作中写入。然而,在读取方面,我是否还需要一个“镜像”操作?例如,如果我不以原子方式读取值,仍然有获取损坏数据的风险吗?
我的直觉是不需要,因为我认为另一个内存访问(例如读取)不能与任何其他原子操作同时发生,即使该其他访问本身不是原子操作。但我想得到一些确认!