使用OpenMP多线程的Stl容器向量push_back

时间:2011-08-16 15:57:28

标签: multithreading openmp push-back

我想将一个对象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)分配元素的数量。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分: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)
  );
}