Один из примеров неправильного использования std::memory_order::relaxed
в стандарте C ++:
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);
// spin wait for another iteration to change the value of x
while (x.load(std::memory_order::relaxed) == 1) { } // incorrect: assumes execution order
});
И затем он говорит:
Приведенный выше пример зависит от порядка выполненияитераций, и не прекратятся, если обе итерации будут выполняться последовательно в одном и том же потоке выполнения.
Вопросы:
В комментарии говорится: «неверно:предполагает выполнение заказа ". Что такое «предполагаемый порядок исполнения»? Я пропускаю это.
Что означают «итерации» в «Приведенном выше примере зависит от порядка выполнения итераций»? Означает ли это итерацию в цикле while? Или это относится к итерации std::for_each
?
Если итерации std::for_each
выполняются параллельно разными потоками, разве не верно, что одна из итераций/ темы не выходят? Поскольку x.fetch_add(1, std::memory_order::relaxed)
является атомарным, и поэтому один поток будет составлять x
1, а другой - x
2, и невозможно иметь x == 1 для обоих потоков. Нет?