c++ - 传递 "shared"指针的 OpenMP 任务

标签 c++ for-loop parallel-processing task openmp

我想在下一个代码中使用 openMP 的任务编译指示:

std::vector<Class*> myVectorClass;
#pragma omp parallel
{
    #pragma omp single nowait
    {
        for (std::list<Class*>::iterator it = myClass.begin(); it != myClass.end();) {
           #pragma omp task firstprivate(it) 
                (*it)->function(t, myVectorClass)) 
            ++it;
        }
    }
    #pragma omp taskwait
}

问题或其中之一是 myVectorClass 是指向对象的指针。因此无法将此 vector 设置为共享。 myVectorClass 由函数修改。之前的代码崩溃了。那么,您能告诉我如何修改以前的代码(不使用 for 循环编译指示)吗?

谢谢

最佳答案

myVectorClass 是一个指针 vector 。在您当前的代码中,您将其设置为共享。由于您的代码崩溃了,我想您在 function() 中更改了 myVectorClass 的长度。但是 std::vector 不是线程安全的,因此在多个线程中修改长度会导致其数据结构崩溃。

根据 function() 的具体作用,您可以有简单的解决方案。基本思想是每个线程使用一个线程本地 vector 来首先收集 function() 的结果,然后将这些 vector 连接/合并为一个 vector 。

此处显示的代码提供了一个很好的示例。

C++ OpenMP Parallel For Loop - Alternatives to std::vector

std::vector<int> vec;
#pragma omp parallel
{
    std::vector<int> vec_private;
    #pragma omp for nowait //fill vec_private in parallel
    for(int i=0; i<100; i++) {
        vec_private.push_back(i);
    }
    #pragma omp critical
    vec.insert(vec.end(), vec_private.begin(), vec_private.end());
}

关于c++ - 传递 "shared"指针的 OpenMP 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686661/

相关文章:

c++ - Openmp:所有线程由于一个线程的延迟而停止

c++ - 在函数中使用 asm,只用字节而不是指令名

bash - bash for 循环中的后台进程

python - 用于更快处理数据的多进程 Python/Numpy 代码

c++ - 三元运算符中的 Cout String 和 int

c++ - 将外部文件添加到 makefile

使用 == 运算符时 R 在 NA 时返回 FALSE

cocoa - Swift:尝试在循环中更新 NSTextField,但它只获取最后一个值

c# - Task.Factory.StartNew "action"参数和更高级别的局部变量

c - (CUDA C) 为什么它不打印从设备内存复制的值?