我有一个对象是
- 多态性,因此需要通过指针传递(或变体,但这似乎有点矫枉过正)
- 足够大且传递足够频繁,因此需要有效传递(即不会被不必要地复制)
- 不是线程安全的,所以当我们进入
omp parallel
部分时需要为每个线程复制
有没有一种方法可以自动为此对象声明适当的复制语义?我的想法是
- 制作我自己的包装器类,其中包含指向对象的指针但进行深拷贝(是否已经有一个行为类似的智能指针类?)
- 始终通过引用传递包装器,这样它不会在函数调用中被复制(我如何检查我没有不小心在某处通过值传递?)
- 为
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/