混合C++ 11 atomics和OpenMP

use*_*080 19 c++ multithreading atomic openmp c++11

OpenMP有自己的原子访问支持,但是,至少有两个理由更喜欢C++ 11原子:它们更灵活,它们是标准的一部分.另一方面,OpenMP比C++ 11线程库更强大.

该标准在两个不同的章节中指定了原子操作库线程支持库.这让我相信原子访问的组件与所使用的线程库是正交的.我确实可以将C++ 11原子和OpenMP结合起来吗?


Stack Overflow上有一个非常类似的问题 ; 然而,它已经基本上没有答案三年了,因为它的答案并没有回答实际的问题.

Zul*_*lan 12

更新:

OpenMP 5.0定义了与C++ 11的交互.其中,它表示使用以下功能可能会导致未指定的行为:

  • 数据依赖性排序:原子和内存模型
  • 添加到标准库
  • C++ 11库

很明显,混合C++ 11 atomics和OpenMP 5.0将导致未指定的行为.至少标准本身承诺"预期OpenMP规范的未来版本将解决[这些]功能".

旧讨论:

有趣的是,OpenMP 4.5标准(2.13.6)对C++ 11原子有一个相当模糊的引用,或者更具体std::memory_order:

目的是,当C++ 11或C11中存在类似操作时,顺序一致的原子构造与C++ 11/C11中的memory_order_seq_cst原子操作具有相同的语义.类似地,非顺序一致的原子结构与C++ 11/C11中的memory_order_relaxed原子操作具有相同的语义.

不幸的是,这只是一个注释,没有任何东西可以定义他们在一起玩得很好.特别是,即使是最新的OpenMP 5.0预览版仍然将C++ 98作为C++的唯一标准参考.从技术上讲,OpenMP甚至不支持C++ 11本身.

除此之外,它可能在实践中大部分时间都有效.我同意std::atomic如果与OpenMP一起使用而不是C++ 11线程,使用的麻烦可能性较小.但如果有任何问题,可能就不那么明显了.最糟糕的情况是原子不会以原子方式运行,即使我在想象可能发生这种情况的现实场景时也会遇到严重问题.在一天结束时,它可能不值得,最安全的是坚持使用纯OpenMP或纯C++ 11线程/原子.

也许Hristo对此有所说明,同时查看这个答案以进行更一般性的讨论.虽然有点过时了,但我担心它仍然存在.

  • 我问一次OpenMP的ARB和****非官方响应的成员是OpenMP和任何其他线程模式之间的互操作性可能永远不会使其进入规范,但大部分供应商无论如何都会做正确的事(TM)为阎周的评论中总结道.换句话说,这样的代码将主要起作用,但永远不会是可移植的. (5认同)