gpt4 book ai didi

c++ - 混合原子和非原子变量和缓存

转载 作者:行者123 更新时间:2023-11-28 05:02:02 26 4
gpt4 key购买 nike

假设我们有这段代码是正确的(我希望至少):

std::atomic<int> a;
std::atomic<bool> ready{false};
void threadA() {
a.store(666, std::memory_order_relaxed);
ready.store(true, std::memory_order_release);
}

void threadB() {
while(!ready.load(std::memory_order_acquire));
process(a.load(std::memory_order_relaxed));
}

我的问题是:如果您使用的是 int a;而不是 std::atomic<int> a; , 这也是正确的吗?还是存在缓存刷新/失效的问题?

最佳答案

不管这是不是个好主意,举个例子,你的代码没问题..

您可以将 a 的原子类型替换为常规 int(或与此相关的任何类型)。
C++ 标准使用以下短语 (§ 1.10.1-6) 支持您的案例:

Certain library calls synchronize with other library calls performed by another thread. For example, an atomic store-release synchronizes with a load-acquire that takes its value from the store

由于 threadB 加载了 threadA 存储的 ready 的值(它在循环中等待它),同步-with 关系建立。因此,a.load() 观察到 a.store() 的内存效应。另一种说法是 a.store() happens-before a.load()

关于c++ - 混合原子和非原子变量和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689529/

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