OpenMP和shared_ptr

时间:2018-11-07 21:41:04

标签: multithreading c++11 openmp

以任何方式在OpenMP并行块中使用shared_ptr是否安全? shared_ptr通过使用原子来保持引用计数的原子性,并且一般而言,据我了解,我们不应将C ++ 11多线程机制与OpenMP混合使用。因此,根据定义,在我看来,在pragma omp块内的任何位置(甚至对于简单的const读取操作)访问shared_ptr都可能会引起问题。还是不是这种情况?

1 个答案:

答案 0 :(得分:2)

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

  • 使用每个指向同一对象的线程get调用operator-> / operator* / shared_ptr。仅对目标对象执行只读操作。这与C ++ 11和OpenMP之间的规范差距一样安全。不执行控制块操作。我认为这与使用原始指针没有什么不同。
  • 在来自多个线程的一个共享get上调用operator-> / operator* / shared_ptr。这仍然同样安全。
  • 复制/删除指向多个线程中不同对象的线程本地shared_ptr。由于没有共享日期,这应该仍然尽可能安全。
  • 从多个线程中复制/删除指向同一对象的线程本地shared_ptr。现在我们知道这涉及共享控制日期,但是根据C ++标准,它是安全的。 std::atomic / OpenMP的参数适用。它实际上是安全的,但定义不明确。
  • 修改(reset)跨多个线程共享的线程shared_ptr。这是不安全的。 atomic<shared_ptr>可以在这里使用,但是适用相同的参数。

我还要再加上一个区别。如果考虑将std::atomic与OpenMP一起使用,则可以选择使用OpenMP惯用的pragma omp atomic-没有与shared_ptr等效的OpenMP。因此,除非在shared_ptr之上实现自己的omp atomic,否则您别无选择。