0

我想将一个对象 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

1 回答 1

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)
  );
}
于 2011-08-17T23:17:27.587 回答