2014-01-28 51 views
1

我有一个对象,它是`shared_ptr`与`OMP平行深层副本firstprivate`

  1. 多态性,因此需要由指针被传递(或变体,但似乎像矫枉过正
  2. 足够大,并通过周围经常不够,它需要被有效地传递(即不复制不必要的)
  3. 不是线程安全的,所以需要当我们进入一个omp parallel部分被复制为每个线程

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

  1. 创建包含一个指向对象,但不深拷贝我自己的包装类(有一个行为像这已经是一个智能指针类?
  2. 总是按引用传递包装所以得到函数调用拷贝(我怎么查我没有不小心按值传递的地方?
  3. 宣布作为firstprivateomp parallel部分,因此它确实获取复制每个线程

这是明智的吗?有没有更好的办法?

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

回答

2

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

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

,关于请求进行深层副本并返回另一个共享指针。然后可以在并行区域内使用此功能,以在需要时实例化obj的私人副本。

+0

有一个upvote提醒我我做这太复杂了:)我最终选择了一个不同的选项。 'scoped_ptr'来处理非拷贝多态语义。在这个包装中添加线程安全性的对象(将张贴在另一个问题)。因此保持线程细节并将其从顶层算法中拷贝出来。 –

+0

另一个更新,一年后重新访问代码。上面提到的'deepCopy'的问题是(我认为)它将在并行的每次迭代中调用一次,因为每个线程只需要一次。所以,事情是把这个类包装在另一个具有深层复制语义的类中,以将它传递到并行区域,然后将其解包到该区域中以进行浅拷贝。 –