gpt4 book ai didi

c++ - 了解 C++ 中放宽的内存顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:52 28 4
gpt4 key购买 nike

std::atomic<int> unique_ids;

void foo() {
int i = unique_ids.fetch_add(1, std::memory_order_relaxed);
std::cout<<i;
}

int main(int argc, char* argv[]) {
std::vector<std::thread> threads;
for (int i = 0; i < 9; ++i) {
threads.emplace_back(foo);
}

for (int i = 0; i < 9; ++i) {
threads[i].join();
}
std::cout << std::endl;
return 0;
}

我的目标是使用 atomic 为并发程序生成唯一的 id,但我不关心顺序。

对于上面的代码,我的理解是 foo 中的输出值应该是不同的,尽管它们的顺序不保证。

我对上面的代码进行了一百次测试,所有结果都符合我的预期。我是原子/内存顺序的初学者,谁能帮助我阐明我的理解?

提前致谢。爱民

附言我想指出这个问题与 c++,std::atomic, what is std::memory_order and how to use them 的问题不同。因为我的问题具体是关于对 memory_order_relaxed 的理解,而不是关于解释原子顺序和内存顺序的一般性问题。

最佳答案

这是对宽松内存排序的合法使用。您只需要该操作相对于对同一原子的其他访问是原子的。无论内存顺序如何,每个原子操作都具有该特征,否则它根本就不是原子操作。

关于c++ - 了解 C++ 中放宽的内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687929/

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