我已阅读文章Synchronization and Multiprocessor Issues 我对 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 = ComputeValue();
其他线程也会正确地看到 iValue。我的意思是其他线程会正确地看到 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 给出了这个建议
"Make y interlocked: If y is interlocked, then there is no race on y because it is atomically updatable,and there is no race on x because a -> b -> d."
.在这个草稿中,Herb 没有使用两个互锁变量(如果我是对的,他的意思是 InterlockedExchange
仅用于 y
)。
最佳答案
如果 iValue
的地址未与保证原子访问的地址对齐,他们这样做是为了防止部分读取/写入。当两个或多个物理线程尝试同时写入值,或者一个读取一个尝试同时写入时,就会出现此问题。
作为次要点,应该注意存储并不总是全局可见的,它们仅在序列化时可见,无论是通过栅栏还是通过总线锁。
关于c++ - InterlockedExchange 和内存可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7685516/