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