gpt4 book ai didi

c++ - InterlockedExchange 和内存可见性

转载 作者:可可西里 更新时间:2023-11-01 12:53:18 24 4
gpt4 key购买 nike

我已阅读文章Synchronization and Multiprocessor Issues 我对 InterlockedCompareExchange 和 InterlockedExchange 有疑问。问题实际上是关于文章中的最后一个例子。它们有两个变量 iValuefValueHasBeenComputed 并且在 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。注意 - 不是 yx

更新
只是为了澄清这个问题。问题是我看到了矛盾。 “同步和多处理器问题”中的示例使用了两个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com