gpt4 book ai didi

c++ - 使用 memory_order_relaxed 进行存储,使用 memory_order_acquire 进行加载

转载 作者:太空狗 更新时间:2023-10-29 20:20:44 28 4
gpt4 key购买 nike

我对以下代码有疑问

#include <atomic>
#include <thread>
#include <assert.h>

std::atomic<bool> x, y;
std::atomic<int> z;

void write_x_then_y()
{
x.store(true, std::memory_order_relaxed);
y.store(true, std::memory_order_relaxed);
}

void read_y_then_x()
{
while (!y.load(std::memory_order_acquire));
if (x.load(std::memory_order_acquire))
++z;
}

int main()
{
x = false;
y = false;
z = 0;
std::thread a(write_x_then_y);
std::thread b(read_y_then_x);
a.join();
b.join();
assert(z.load() != 0);
}

我能确定 assert(z.load() != 0) 总是假的吗?我认为 x.store 和 y.store 没有在数据提供程序线程中重新排序(这是真的吗?)。出于这个原因,我认为如果加载由 x 和 y 存储的值的线程使用 memory_order_acquire,它会从执行存储运算符的核心缓存中获取 x 和 y 的实际值。

最佳答案

我认为断言可能会失败。 std::memory_order_relaxed 允许编译器对 write_x_then_y 中的存储重新排序。 (例如,如果它出于任何原因认为它会更快。)因此它可能会在 x 之前写入 y。整个 read_y_then_x 可能发生在这两次写入之间,因此它将观察到 ytruexfalse 并且它不会递增 z

关于c++ - 使用 memory_order_relaxed 进行存储,使用 memory_order_acquire 进行加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720228/

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