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中的输出值应该不同,尽管它们的订单不能保证。
我测试了上面的代码一百次,所有的结果都是我的预期。我是原子/记忆顺序的初学者,任何人都可以帮我澄清我的理解吗?
提前致谢。 爱民
P.S。我想指出这个问题与c++,std::atomic, what is std::memory_order and how to use them不同,因为我的问题是关于对memory_order_relaxed的理解,而不是关于原子和内存顺序的解释的一般性问题。
答案 0 :(得分:2)
这是放宽内存排序的合法用法。您只需要对相同原子的其他访问进行原子操作。无论内存排序如何,每个原子操作都具有该特性,或者根本不具有原子性。