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