【发布时间】:2017-05-09 14:57:13
【问题描述】:
OpenMP 有自己对原子访问的支持,但是,至少有两个原因更喜欢 C++11 原子:它们更灵活,并且它们是标准的一部分。另一方面,OpenMP 比 C++11 线程库更强大。
该标准在两个不同的章节中指定了原子操作库和线程支持库。这让我相信原子访问的组件与使用的线程库有点正交。我真的可以将 C++11 atomics 和 OpenMP 结合起来吗?
Stack Overflow上有一个很similar question;但是,由于它的答案没有回答实际问题,因此三年来基本上没有答案。
【问题讨论】:
-
为什么你不能?只是不要尝试获取 C++ 互斥体并使用 OpenMP 等待它。
-
@brianbeuning 好吧,我不确定,这就是我问的原因。链接问题有一条评论推测我们“可能会遇到问题”。我在网上找不到任何可靠的答案,这就是我再次提出这个问题的原因。
-
这是实现定义的行为,可能因编译器而异。但是,还有一个更“实用”的答案。在大多数情况下,如果标准库和 OpenMP 运行时来自同一编译器供应商,那么您很可能会没事。例如,将 GCC 与 libstdc++ 和 libgomp 一起使用,与 libc++ 和 LLVM (Intel) 运行时一起使用。使用没有自己的标准库的编译器时可能会出现问题,例如 Linux 上带有 libstdc++ 的 Intel C++ 或 macOS 上带有 libc++ 的编译器。我在这种情况下遇到过问题,但很少见。
-
也就是说,在大多数情况下,您应该期望它们按预期工作。但只是更仔细地测试它。标准库线程和 OpenMP 等线程工具更多地是特定于操作系统的问题,而原子则更多地与硬件相关。有可能工具链的一部分,比如编译器中的 OpenMP 滥用了操作系统特性,而另一部分,标准库对操作系统做出了不同的假设,最终它们不能很好地发挥作用。任何软件都可能有错误。但如果不同的部件来自同一个供应商,它可能更有可能得到更彻底的测试
-
“这让我相信原子访问的组件与所使用的线程库有点正交” - 根据我的理解,它们并不是正交的.相反,它们是不同的原语,在略微不同的级别上运行以解决不同的问题。如果我必须根据我的理解来描述它们,那么我会说它们是相互恭维的。另见C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?。
标签: c++ multithreading c++11 openmp atomic