我已阅读文章同步和多处理器问题,并且对 InterlockedCompareExchange 和 InterlockedExchange 有疑问。这个问题实际上是关于文章中的最后一个例子。它们有两个变量iValue
,fValueHasBeenComputed
并且在CacheComputedValue()
它们中使用InterlockedExchange
:
InterlockedExchange ((LONG*)&iValue, (LONG)ComputeValue()); // don't understand
InterlockedExchange ((LONG*)&fValueHasBeenComputed, TRUE); // understand
我知道我可以InterlockedExchange
用于修改iValue
,但仅仅做就够了吗
iValue = ComputeValue();
那么真的有必要使用InterlockedExchange
来设置iValue吗?或者其他线程将正确看到 iValue,即使iValue = ComputeValue();
. 我的意思是其他线程会正确看到 iValue,因为它InterlockedExchange
后面有。
还有论文A Principle-Based Sequential Memory Model for Microsoft Native Code Platforms。有一个 3.1.1 示例,其代码或多或少相同。推荐之一Make y interlocked
。注意 - 不是两者y
和x
。
更新
只是为了澄清这个问题。问题是我看到了矛盾。“同步和多处理器问题”中的示例使用两个InterlockedExchange
. 相反,在示例 3.1.1 “Basic Reodering”(我认为这与第一个示例非常相似)中,Herb Sutter 给出了这个建议
“使 y 互锁:如果 y 互锁,则 y 上没有竞争,因为它是原子可更新的,并且 x 上没有竞争,因为 a -> b -> d。”
. 在这个草稿草稿中,不要使用两个互锁的变量(如果我是对的,他的意思是InterlockedExchange
仅用于y
)。