【问题标题】:`shared_ptr` with deep copy for `omp parallel firstprivate``shared_ptr` 与 `omp parallel firstprivate` 的深拷贝
【发布时间】:2014-01-28 15:09:49
【问题描述】:

我有一个对象

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

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

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

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

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

【问题讨论】:

    标签: c++ multithreading openmp smart-pointers


    【解决方案1】:

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

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

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

    【讨论】:

    • 赞成提醒我我把这件事弄得太复杂了 :) 最后我选择了一个不同的选项。 scoped_ptr 处理非复制多态语义。并在其中添加一个为对象添加线程安全的包装器(将在另一个问题中发布)。从而保留线程细节并复制顶级算法。
    • 另一个更新,一年后重新访问代码。如上所述,deepCopy 的问题是(我认为)每次并行迭代都会调用一次,而每个线程只需要一次。因此,问题是将类包装在另一个具有深复制语义的类中,以将其传递到并行区域,然后在区域内将其解包以进行浅复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2011-02-09
    • 2022-01-15
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多