параллелизм — Понимание порядка памяти, ослабленного в переполнении стека

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 для генерации уникального идентификатора для программы параллелизма, но мне нет дела до заказов.

Для приведенного выше кода я понимаю, что выходные значения в foo должны отличаться, хотя их порядок не гарантируется.

Я тестировал приведенный выше код сто раз, и все результаты оказались такими, как я ожидал. Я новичок в атомарном порядке / памяти, может кто-нибудь помочь мне прояснить мое понимание?

Заранее спасибо.
Aimin

Постскриптум Я хотел бы отметить, что этот вопрос не совпадает с c ++, std :: atomic, что такое std :: memory_order и как их использовать поскольку мой вопрос касается именно понимания memory_order_relaxed, а не общего вопроса об объяснении атомного порядка и порядка памяти.

5

Решение

Это законное использование упорядоченного порядка памяти. Вам просто нужно, чтобы операция была атомарной по отношению к другим доступам к тому же атомарному. Каждая атомарная операция имеет эту характеристику независимо от порядка в памяти, иначе она не будет атомарной вообще.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]