На ссылочном веб-сайте cpp по политике выполнения есть такой пример:
std::atomic<int> x{0};
int a[] = {1,2};
std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
x.fetch_add(1, std::memory_order_relaxed);
while (x.load(std::memory_order_relaxed) == 1) { } // Error: assumes execution order
});
Как вы видите, это пример (предположительно) ошибочного кода. Но я не очень понимаю, в чем здесь ошибка, мне не кажется, что какая-то часть кода предполагает порядок выполнения. AFAIK, первый поток на fetch_add
будет ждать второй поток, но это не проблема. Я что-то упустил и там какая-то ошибка?