Интересно, что стандарт OpenMP 4.5 (2.13.6) имеет довольно неопределенную ссылку на C++ 11 Атомикс, или более конкретно std::memory_order
:
Намерение состоит в том, что, когда аналогичная операция существует в C++ 11 или C11, последовательная последовательная атомная конструкция имеет ту же семантику как атомную операцию memory_order_seq_cst в C++ 11/C11. Аналогичным образом, некоторая последовательная атомная конструкция имеет ту же семантику, что и . Операция памяти_order_relaxed атома в C++ 11/C11.
К сожалению, это только примечание, нет ничего, что бы определяло, что они прекрасно играют вместе. В частности, даже последний предварительный просмотр OpenMP 5.0 по-прежнему относится к C++ 98 как единственная нормативная ссылка для C++. Итак, технически, OpenMP даже не поддерживает C++ 11.
Это в сторону, вероятно, будет работать большую часть времени на практике. Я бы согласился с тем, что использование std::atomic
имеет меньший потенциал для проблем при использовании вместе с OpenMP, чем с потоком C++ 11. Но если есть какие-то проблемы, это может быть не так очевидно. Худший случай будет атомом, который не работает атомарно, хотя у меня есть серьезные проблемы с реалистичным сценарием, где это может произойти. В конце концов, это может не стоить того, и самое безопасное - придерживаться чистого потока OpenMP или чистого C++ 11 thread/atomics.
Возможно, у Христа есть что сказать об этом, в то же время проверьте this answer для более общей дискуссии. Хотя я немного устарел, я боюсь, что он все еще держится.
Почему бы не быть точным? Просто не пытайтесь получить мьютекс C++ и ждать его с помощью OpenMP. –
@brianbeuning Ну, я не уверен, вот почему я спрашиваю. Есть комментарий к связанному вопросу, предполагающему, что мы, скорее всего, столкнемся с проблемами.Я не мог найти твердого ответа на вопрос в Интернете, поэтому я как бы снова поднял вопрос. – user1494080
Это поведение, определенное реализацией, и может варьироваться между компиляторами. Однако есть и более «практический» ответ. В большинстве случаев, если стандартная библиотека и среда выполнения OpenMP исходят от того же поставщика компилятора, вы, скорее всего, будете в порядке. Например, с использованием GCC с libstdC++ и libgomp, clang с libC++ и LLVM (Intel). Возможно, возникнут проблемы при использовании компилятора, у которого нет собственной стандартной библиотеки, например, Intel C++ с libstdC++ в Linux или libC++ на macOS. Я видел проблемы в этом случае, но очень редко. –