Ответ 1
Интересно, что стандарт OpenMP 4.5 (2.13.6) имеет довольно туманную ссылку на атомарность С++ 11 или более конкретный std::memory_order
:
Цель состоит в том, что, когда аналогичная операция существует в С++ 11 или C11, последовательная последовательная атомная конструкция имеет одинаковую семантику как атомная операция memory_order_seq_cst в С++ 11/C11. Аналогичным образом, не последовательная последовательная атомная конструкция имеет ту же семантику, что и атомная операция memory_order_relaxed в С++ 11/C11.
К сожалению, это только примечание, нет ничего, что бы определяло, что они играют хорошо вместе. В частности, даже последний предварительный просмотр OpenMP 5.0 по-прежнему относится к С++ 98 как единственная нормативная ссылка для С++. Таким образом, технически, OpenMP даже не поддерживает С++ 11.
Что в стороне, это, вероятно, будет работать большую часть времени на практике. Я согласен с тем, что использование std::atomic
имеет меньший потенциал для проблем, если использовать вместе с OpenMP, чем потоки С++ 11. Но если есть какие-то проблемы, это может быть не так очевидно. Худший случай будет атомом, который не работает атомарно, хотя у меня есть серьезные проблемы с реалистичным сценарием, где это может произойти. В конце концов, это может не стоить того, и самое безопасное - придерживаться чистой версии OpenMP или чистого С++ 11 потока/атома.
Возможно, у Христа есть что сказать об этом, в то же время просмотрите этот ответ для более общей дискуссии. Хотя я немного устарел, я боюсь, что он все еще держится.