Multithreading OpenMP和共享ptr

Multithreading OpenMP和共享ptr,multithreading,c++11,openmp,Multithreading,C++11,Openmp,在OpenMP并行块内以任何方式使用共享\u ptr安全吗?shared\u ptr通过使用原子来维护引用计数的原子性,一般来说,我的理解是,我们不应该将C++11多线程机制与OpenMP混合使用。因此,根据定义,在我看来,访问pragma omp块中任何位置的共享\u ptr(即使对于简单的常量读取操作)都可能导致问题。或者情况并非如此?您的分析非常正确。首先,看一看关于的这个问题。请注意,std::shared_ptr不一定使用原子实现。这也适用于共享控制块,该控制块在复制操作期间使用进行修

在OpenMP并行块内以任何方式使用
共享\u ptr
安全吗?
shared\u ptr
通过使用原子来维护引用计数的原子性,一般来说,我的理解是,我们不应该将C++11多线程机制与OpenMP混合使用。因此,根据定义,在我看来,访问
pragma omp
块中任何位置的共享\u ptr(即使对于简单的常量读取操作)都可能导致问题。或者情况并非如此?

您的分析非常正确。首先,看一看关于的这个问题。请注意,
std::shared_ptr
不一定使用原子实现。这也适用于共享控制块,该控制块在复制操作期间使用进行修改。有两种情况:

  • 调用
    get
    /
    操作符->
    /
    操作符*
    ,每个指向同一对象的线程有一个
    共享的ptr
    。仅对目标对象执行只读操作。考虑到C++11和OpenMP之间的规范差异,这是非常安全的。不执行控制块操作。我认为这与使用原始指针没有什么不同
  • 从多个线程在一个共享的
    shared\u ptr
    上调用
    get
    /
    操作符->
    /
    操作符*
    。这同样是安全的
  • 复制/删除跨多个线程指向不同对象的线程本地
    共享\u ptr
    s。这应该仍然是安全的,因为没有共享的日期
  • 正在从多个线程复制/删除指向同一对象的本地线程
    shared_ptr
    s。现在我们知道这涉及共享控制日期,但是它是安全的,根据C++标准。
    std::atomic
    /OpenMP的参数适用。它实际上是安全的,但不是很明确
  • 跨多个线程修改(
    reset
    )共享的线程。这是不安全的<这里可以使用code>atomic,但同样的参数也适用
我想再做一个区分。如果考虑使用<代码> STD::Audio OpenMP,则可以使用OpenMP习惯用法<代码> PrimaOMP原子< /代码>没有OpenMMP等同于代码> SyddYPPT。在
omp-atomic
的基础上实现自己的
shared_ptr
,你真的没有选择