`shared_ptr`与`omp parallel firstprivate`的深拷贝

时间:2014-01-28 15:09:49

标签: c++ multithreading openmp smart-pointers

我有一个

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

    有没有办法可以自动为这个对象声明适当的复制语义?我的想法是

    1. 制作我自己的包装器类,其中包含指向该对象的指针但是执行深层复制(是否有一个类似于此的智能指针类?
    2. 总是通过引用传递包装器,因此不会在函数调用中被复制(如何检查我是否在某处意外地通过了值?
    3. firstprivate部分声明为omp parallel,以便为每个帖子复制
    4. 这是明智的吗?有没有更好的办法?

      编辑:复制构造函数如何检查omp_get_thread_num()是否已更改并执行适当的指针或深层复制?

1 个答案:

答案 0 :(得分:2)

我会使用shared_ptr来管理对象,并实现一个函数:

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

在请求时执行深层复制并返回另一个共享指针。然后,可以在并行区域内使用此函数,以在需要时实例化obj的私有副本。