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;
}
Моя цель - использовать атомный для генерации уникального идентификатора для программы параллелизма, но меня не интересуют заказы.Понимание порядка памяти ослаблено в C++
Для приведенного выше кода я понимаю, что выходные значения в foo должны отличаться, хотя их заказы не гарантируются.
Я проверил вышеуказанный код сто раз, и все результаты - то, что я ожидал. Я новичок в атомизме/памяти, может ли кто-нибудь помочь мне прояснить мое понимание?
Заранее спасибо. Aimin
P.S. Я хотел бы отметить, что этот вопрос не совпадает с тем, что у меня c++,std::atomic, what is std::memory_order and how to use them, так как мой вопрос касается понимания памяти_order_relaxed, а не общего вопроса об объяснении порядка атомов и памяти.
@ πάνταῥεῖ Речь идет о 'memory_order_relaxed' не' memory_order'. – nbro
@ πάνταῥεῖ Я думаю, что мой вопрос не совпадает с тем, что [C++, std :: atomic, что такое std :: memory_order и как их использовать] (http://stackoverflow.com/questions/9553591/c-stdatomic -what-is-stdmemory-order-and-how-to-use-them), так как мой вопрос конкретно касается понимания memory_order_relaxed. Благодарю. –
@ πάνταῥεῖ Речь идет об определенной проблеме, а не о какой-то концепции вообще. Неверное дублирование. – 2501