2013-10-30 107 views
1

我想用的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是一个指向对象。所以不可能将此矢量设置为共享。 myVectorClass由函数修改。之前的代码崩溃。那么,你能告诉我如何修改以前的代码(不使用for-loop编译指示)吗?

由于

+0

是什么'函数()'做什么?它如何修改'myVectorClass'? – kangshiyin

+0

函数function()在这里显示的相当复杂,但它向myVectorClass添加了元素。 – smc

+0

如果答案解决了您的问题,请通过单击答案旁边的复选标记来接受它。不要在标题中编辑“解决”。 – Mysticial

回答

1

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

根据function()的确切做法,您可以有简单的解决方案。基本思想是每个线程使用一个线程局部向量首先收集function()的结果,然后将这些向量连接/合并为一个向量。

此处显示的代码给出了一个很好的例子。

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()); 
} 
+0

谢谢,它的工作原理。不过,我有其他问题与迭代器。我会写一篇新文章。 – smc