2011-08-16 13 views
0

オブジェクトを別のスレッドのベクトルにpush_backしたいとします。いいえ。スレッドの数はマシンによって異なります。OpenMPマルチスレッドを使用したStlコンテナベクトルpush_back

#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

関連する問題