2016-01-02 29 views
2

我嘗試了並行功能,即分配內存,但我有一個壞堆的例外。內存必須一次使用過一些線程。如何在OpenMP C++中分配動態內存

void GetDoubleParameters(CInd *ci) 
{ 
    for(int i=0;i<ci->size();i++) 
    { 
     void *tmp; 
     #pragma omp parallel private (tmp) 
     { 
      for(int j=0;j<ci[i].getValues().size();j++) 
      { 
       tmp = (void*)new double(ci[i].getValues()[j]); 
       ci->getParameters().push_back(tmp); 
      } 
     } 

    } 
} 
+0

您確定不會耗盡內存嗎?順便說一句,只有一個線程,所以分配操作不會真正並行運行。你也把所有的東西都放在同一個矢量中... – Christophe

+0

@Christophe我想在某些線程中將tmp推入矢量中。這是真的嗎? –

+0

是的,但是如果你有100個線程,而一個將分配,另外99個線程將不得不等待。在理論上它是平行的,但在實踐中,它幾乎是連續的。 – Christophe

回答

0

的問題是線:

ci->getParameters().push_back(tmp); 

CI被所有並行線程一次訪問,其與常規的push_back(可能一個std ::矢量)參數元件可能不是線程-安全。 您將不得不圍繞此代碼組織一些警衛。例如:

omp_lock_t my_lock; 
... 
// initialize lock 
omp_init_lock (&my_lock); 
... 

// do something sensible in parallel 
    ... 
    { 
     omp_guard my_guard (my_lock); 
     // protected region starts here 
     // only one thread at a time works here 
    } 
    // more parallel work 
    ... 
} 
omp_destroy_lock (&my_lock);