1
我有一个对象,它是`shared_ptr`与`OMP平行深层副本firstprivate`
- 多态性,因此需要由指针被传递(或变体,但似乎像矫枉过正)
- 足够大,并通过周围经常不够,它需要被有效地传递(即不复制不必要的)
- 不是线程安全的,所以需要当我们进入一个
omp parallel
部分被复制为每个线程
有没有一种方法可以自动为这个对象声明适当的复制语义?我的想法是
- 创建包含一个指向对象,但不深拷贝我自己的包装类(有一个行为像这已经是一个智能指针类?)
- 总是按引用传递包装所以不得到函数调用拷贝(我怎么查我没有不小心按值传递的地方?)
- 宣布作为
firstprivate
为omp parallel
部分,因此它确实获取复制每个线程
这是明智的吗?有没有更好的办法?
编辑:复制构造函数如何检查omp_get_thread_num()
是否已更改并根据需要执行指针或深度复制?
有一个upvote提醒我我做这太复杂了:)我最终选择了一个不同的选项。 'scoped_ptr'来处理非拷贝多态语义。在这个包装中添加线程安全性的对象(将张贴在另一个问题)。因此保持线程细节并将其从顶层算法中拷贝出来。 –
另一个更新,一年后重新访问代码。上面提到的'deepCopy'的问题是(我认为)它将在并行的每次迭代中调用一次,因为每个线程只需要一次。所以,事情是把这个类包装在另一个具有深层复制语义的类中,以将它传递到并行区域,然后将其解包到该区域中以进行浅拷贝。 –