gpt4 book ai didi

c++ - C++11获取/释放VS顺序一致性?

转载 作者:行者123 更新时间:2023-12-01 14:40:43 25 4
gpt4 key购买 nike

#include <thread>
#include <atomic>
#include <cassert>

std::atomic<bool> x = {false};
std::atomic<bool> y = {false};
std::atomic<int> z = {0};

void write_x()
{
x.store(true, std::memory_order_release);
}

void write_y()
{
y.store(true, std::memory_order_release);
}

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

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

int main()
{
std::thread a(write_x);
std::thread b(write_y);
std::thread c(read_x_then_y);
std::thread d(read_y_then_x);
a.join(); b.join(); c.join(); d.join();
assert(z.load() != 0);
}

如果我将 seq_cst 替换为在 cppreference's last example 中获取/释放,assert(z.load() != 0) 可以失败吗?

  • Seq_CST 可以阻止 StoreLoad 重新排序,但代码没有。
  • Acquire 可以防止 LoadLoad 重新排序。
  • 发布可以防止 StoreStore 重新订购。

最佳答案

是的,如果您使用 acquire/release 命令,您的代码中可能有 z.load() == 0完成了。对 xy 的独立写入之间没有发生之前的关系。 cppreference 专门使用该示例来说明获取/释放不足的情况并非巧合。

这有时称为 IRIW(独立写入的独立读取),并且在某些硬件订购模型中往往被掩盖。特别是,仅根据可能的加载-加载、加载-存储、存储-存储等定义的内存模型,重新排序并没有说明任何关于 IRIW 的任何方式。在 x86 内存模型中,IRIW 重新排序是不允许的,因为一个子句解释了存储具有总顺序并且所有处理器都以相同的顺序查看存储。

我不知道是否有任何常用的 CPU 在使用获取和释放所需的障碍和/或指令时允许 IRIW 重新排序,但如果有人这样做我不会感到惊讶。

关于c++ - C++11获取/释放VS顺序一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50462948/

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