我有一些简单的(希望是)问题,我一直无法找到答案 -
假设我有多个线程可以访问的对象 a、b。
Interlocked.Exchange(ref a, b)
如果 'b' 不是 volatile,这个操作会这样对待它吗?即它会从内存中获取这个变量的最新值吗?如果是这样,那是写的“原子”读吗?我知道 Interlocked.Exchange 的主要目的是您将获得以前的“a”值作为新写入的原子操作。但我的主要困惑是“b”的实际值被写入“a”。
我的第二个问题与本文中的一句话有关:
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
“一个有趣的点是,根据此处和此处记录的内存模型,C# 中的所有写入都是易失性的,并且可能也是这样实现的。C# 语言的 ECMA 规范实际上定义了一个较弱的模型,其中默认情况下写入不是易失性的。”
这是真的?如果是这样,如果不关心“a”的先前值,是否有 Interlocked.Exchange 的目的?(关于我的第一个例子)。我没有看到关于 StackOverflow 的任何其他文章或评论,因为每次写入都是易失性的。但是,我知道写入是原子的。
编辑:如果我的第一个问题的答案是“b”不被视为易失性,而我的第二个问题的答案是写入确实是易失性的,那么跟进是,如果我们不这样做,什么时候 interlocked.exhange 有用'不在乎'a'的先前值?