我对 C++ 不是很有经验,所以我可能会遗漏一些明显的东西。我知道 vector.insert 的“无效迭代器”问题,但我不知道在这种情况下会发生什么。还涉及一些 OpenMP,但插入本身位于并行块之外。
void doWork(vector<Solution> &sol)
{
vector<Solution> partial[40];
#pragma omp parallel for ... shared(partial) ...
for (...) {
...
partial[tid].push_back(Solution(i,j));
...
}
for (i = 0; i < 40; i++)
sol.insert(sol.end(), partial[i].begin(), partial[i].end());
}
编辑:错误消息是标准错误分配。我确信没有超过 40 个线程。显然,即使有 1 个线程也会发生这种情况(打开和关闭)。更有趣的是另一种解决方案:
for(i = 0; i < 40; i++)
for(j = 0; j < partial[i].size(); j++)
sol.push_back(partial[i][j]);
似乎一直在工作,在可变数量的线程上。