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