Multithreading OpenMP和共享ptr
在OpenMP并行块内以任何方式使用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不一定使用原子实现。这也适用于共享控制块,该控制块在复制操作期间使用进行修
共享\u ptr
安全吗?shared\u ptr
通过使用原子来维护引用计数的原子性,一般来说,我的理解是,我们不应该将C++11多线程机制与OpenMP混合使用。因此,根据定义,在我看来,访问pragma omp
块中任何位置的共享\u ptr(即使对于简单的常量读取操作)都可能导致问题。或者情况并非如此?您的分析非常正确。首先,看一看关于的这个问题。请注意,std::shared_ptr
不一定使用原子实现。这也适用于共享控制块,该控制块在复制操作期间使用进行修改。有两种情况:
- 调用
/get
/操作符->
,每个指向同一对象的线程有一个操作符*
。仅对目标对象执行只读操作。考虑到C++11和OpenMP之间的规范差异,这是非常安全的。不执行控制块操作。我认为这与使用原始指针没有什么不同共享的ptr
- 从多个线程在一个共享的
上调用shared\u ptr
/get
/操作符->
。这同样是安全的操作符*
- 复制/删除跨多个线程指向不同对象的线程本地
s。这应该仍然是安全的,因为没有共享的日期共享\u ptr
- 正在从多个线程复制/删除指向同一对象的本地线程
s。现在我们知道这涉及共享控制日期,但是它是安全的,根据C++标准。shared_ptr
/OpenMP的参数适用。它实际上是安全的,但不是很明确std::atomic
- 跨多个线程修改(
)共享的线程。这是不安全的<这里可以使用code>atomic,但同样的参数也适用reset
omp-atomic
的基础上实现自己的shared_ptr
,你真的没有选择