Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ `为omp parallel firstprivate共享\u ptr`和深度拷贝`_C++_Multithreading_Openmp_Smart Pointers - Fatal编程技术网

C++ `为omp parallel firstprivate共享\u ptr`和深度拷贝`

C++ `为omp parallel firstprivate共享\u ptr`和深度拷贝`,c++,multithreading,openmp,smart-pointers,C++,Multithreading,Openmp,Smart Pointers,我有一个目标是 多态性,因此需要通过指针(或变体)传递,但这似乎有些过分了 足够大且传递频率足够高,因此需要高效地传递(即,不进行不必要的复制) 不是线程安全的,因此当我们进入omp parallel部分时,需要为每个线程复制 有没有一种方法可以自动为这个对象声明适当的复制语义?我的想法是 制作我自己的包装器类,其中包含指向对象的指针,但进行深度复制(是否已经有这样的智能指针类?) 始终通过引用传递包装,这样它就不会在函数调用中被复制(如何检查我是否在某个地方意外地传递了值?) 将其声明为omp

我有一个目标是

  • 多态性,因此需要通过指针(或变体)传递,但这似乎有些过分了
  • 足够大且传递频率足够高,因此需要高效地传递(即,不进行不必要的复制)
  • 不是线程安全的,因此当我们进入
    omp parallel
    部分时,需要为每个线程复制
  • 有没有一种方法可以自动为这个对象声明适当的复制语义?我的想法是

  • 制作我自己的包装器类,其中包含指向对象的指针,但进行深度复制(是否已经有这样的智能指针类?)
  • 始终通过引用传递包装,这样它就不会在函数调用中被复制(如何检查我是否在某个地方意外地传递了值?)
  • 将其声明为
    omp parallel
    部分的
    firstprivate
    ,以便为每个线程复制它
  • 这明智吗?有更好的办法吗

    编辑:一个复制构造函数如何检查
    omp\u get\u thread\u num()
    是否已更改,并根据需要执行指针或深度复制?

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

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

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

    请向上投票,提醒我这太复杂了:)最后我选择了另一个选项
    scoped_ptr
    处理非复制多态语义。在这里面有一个包装器,用于向对象添加线程安全性(将在另一个问题中发布)。因此,保留线程细节并从顶级算法中复制。另一个更新,一年后重新访问代码。如上所述,
    deepCopy
    的问题是(我认为)它将在并行的每个迭代中调用一次,而每个线程只需要一次。因此,问题是将类包装在另一个具有深度复制语义的类中,将其传递到并行区域,然后在区域内展开它以进行浅层复制。