c++ - `shared_ptr` 和 `omp parallel firstprivate` 的深拷贝

标签 c++ multithreading openmp smart-pointers

我有一个对象是

  1. 多态性,因此需要通过指针传递(或变体,但这似乎有点矫枉过正)
  2. 足够大且传递足够频繁,因此需要有效传递(即不会被不必要地复制)
  3. 不是线程安全的,所以当我们进入 omp parallel 部分时需要为每个线程复制

有没有一种方法可以自动为此对象声明适当的复制语义?我的想法是

  1. 制作我自己的包装器类,其中包含指向对象的指针但进行深拷贝(是否已经有一个行为类似的智能指针类?)
  2. 始终通过引用传递包装器,这样它不会在函数调用中被复制(我如何检查我没有不小心在某处通过值传递?)
  3. omp parallel 部分将其声明为 firstprivate,以便它确实为每个线程复制

这合理吗?有没有更好的办法?

编辑:检查 omp_get_thread_num() 是否已更改并根据需要执行指针或深度复制的复制构造函数怎么样?

最佳答案

我会使用 shared_ptr管理对象,实现功能:

shared_ptr<T> deepCopy(const shared_ptr<T>& obj);

根据请求执行深度复制并返回另一个共享指针。然后可以在并行区域内使用此函数,以在需要时实例化 obj 的私有(private)拷贝。

关于c++ - `shared_ptr` 和 `omp parallel firstprivate` 的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21409331/

相关文章:

c++ - 我将如何清理这些If语句?

c++ - 我应该将我所有的 c++ 代码包装在它自己的命名空间中吗?

c++ - 以编程方式检测 MessageBox 是否在 Windows CE 中打开

c# - 有什么理由立即使用 await 和 async 吗?

multithreading - OpenMP : Is there a way for a thread to terminate all other parallel threads?

c++ - 使用 OpenMP 的复杂类型

.net - 在 .NET 中检测(未知)硬件

java - 为什么当我运行代码时 obj.start() 不运行?

c - 如何在c/c++中异步运行线程的特定功能?

c++ - 如何有条件地终止 OpenMP 中的并行区域?