Read(Int64)
.NET系统类System.Threading.Volatile
和方法的区别(如果有)System.Threading.Interlocked
?
具体来说,关于(a)原子性和(b)内存排序,它们各自的保证/行为是什么。
请注意,这是关于Volatile
阶级,不是的volatile
(小写)的关键字。
MS docs状态:
易读方法
读取字段的值。在需要它的系统上,插入一个内存屏障,以防止处理器按如下方式重新排序内存操作:如果在代码中此方法之后出现读或写操作,则处理器无法在此方法之前移动它。
...
退货
Int64
读取的值。不管处理器数量或处理器缓存状态如何,此值都是计算机中任何处理器写入的最新值。
与
Interlocked.Read(Int64)方法
返回作为原子操作加载的64位值。
似乎特别令人困惑的是,这些Volatile
文档没有谈论原子性,并且这些Interlocked
文档没有谈论排序/内存障碍。
旁注:作为参考:我更熟悉C ++原子API,其中原子操作也总是指定内存排序语义。
Pavel有用地提供的问题链接(和可传递链接)很好地解释了挥发性记忆屏障和原子无裂痕读物的区别/正交性,但它们并没有解释这两个概念如何应用于这两个类别。
Volatile.Read
保证原子性?Interlocked.Read
(或者,真的,任何的Interlocked
功能)做出的内存为了任何保证?Interlocked.Read
转换为CompareExchange操作:
public static long Read(ref long location)
{
return Interlocked.CompareExchange(ref location, 0, 0);
}
因此,它具有CompareExchange的所有优点:
Volatile.Read
另一方面只获得语义。它可以帮助您确保读取操作的执行顺序,而无需任何原子性或新鲜度保证。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句