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;
}
私の目的は、並行プログラムの一意のIDを生成するためにアトミックを使用することですが、私はその命令を気にしません。C++でリラックスしたメモリの順序を理解する
上記のコードでは、fooの出力値はその順序が保証されていないにもかかわらず異なるはずです。
私は上記のコードを100回テストしましたが、結果はすべて私が期待したものです。私は原子/記憶秩序の初心者です。私の理解を明確にするのに誰も助けてくれますか?
ありがとうございます。 Aimin
P.S.この質問は、私の質問が原子とメモリの順番の説明に関する一般的な質問ではなく、memory_order_relaxedの理解に関するものであるため、c++,std::atomic, what is std::memory_order and how to use themと同じではないことを指摘したいと思います。
@πάνταῥεῖこれは 'memory_order_relaxed'ではなく' memory_order'です。 – nbro
@πάνταῥεῖ私の質問は、[C++、std :: atomic、std :: memory_orderとは何か、そしてそれらを使う方法と同じではないと思います(http://stackoverflow.com/questions/9553591/c-stdatomic私の質問は特にmemory_order_relaxedの理解に関するものであるからです。ありがとう。 –
@πάνταῥεῖこれは一般的な概念ではなく、特定の問題に関するものです。ダップクロージャが間違っています。 – 2501