gpt4 book ai didi

c++ - 关于 C++11 内存模型的奇怪结果(松散排序)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:04 27 4
gpt4 key购买 nike

我正在测试 Anthony Williams 的书“C++ Concurrency”中的内存模型示例

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

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_relaxed));
if(x.load(std::memory_order_relaxed)) {
++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);
}

根据解释,可以自由地重新排序对差异变量(此处为 x 和 y)的宽松操作。但是,我反复运行了好几天的问题。我从来没有遇到断言 (assert(z.load()!=0);) 触发的情况。我只是使用默认优化并使用 g++ -std=c++11 -lpthread dataRaceAtomic.cpp 编译代码有没有人真正尝试过并做出断言?谁能给我解释一下我的测试结果?顺便说一句,我也尝试了不使用原子类型的版本,我得到了相同的结果。目前,这两个程序运行良好。谢谢。

最佳答案

这取决于您运行的处理器类型。

x86 没有像其他处理器那样宽松的内存模型。特别是,绝不会针对其他商店重新订购商店。

http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/有更多关于 x86 内存模型的信息。

关于c++ - 关于 C++11 内存模型的奇怪结果(松散排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222767/

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