2013-10-30 114 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