2011-08-16 64 views
0

我想push_back一個對象從不同的線程向量。沒有。的線程取決於機器。Stl容器矢量push_back與OpenMP多線程

#pragma omp parallel shared(Spaces, LookUpTable) private(LutDistribution, tid) 
{ 
    tid = omp_get_thread_num(); 

    BestCoreSpaces.push_back(computeBestCoreSpace(tid, &Spaces, &LookUpTable, LutDistribution)); 
} 

問題是,我不確定它是否工作。我不會碰撞。我正在使用openMP。是openMP排隊的東西? 也許它已經足夠使用BestCoreSpaces.reserve(tid)爲容器保留內存,或者使用BestCoreSpaces.assign(tid,Space)分配元素的數量。有人能幫助我嗎?

回答

4

你剛剛擺脫它 - 根據編譯時的優化級別,線程執行和/或星號對齊,你的競爭條件可能會或可能不會表現出來。

您必須使push_back()成爲關鍵部分(即使用互斥鎖)。例如:

#pragma omp parallel shared(Spaces, LookUpTable, BestCoreSpaces) private(LutDistribution, tid) 
{ 
    tid = omp_get_thread_num(); 
#pragma omp critical 
    BestCoreSpaces.push_back( 
    computeBestCoreSpace(tid, &Spaces, &LookUpTable, LutDistribution) 
); 
} 
+0

我會試試這個,非常感謝! – Florian