我尝试使用 openMP V.2.0 编写并行 for 循环。在并行区域的中间,我构造了一个对象,我希望每个线程构造一次该对象。
#pragma omp parallel for
for (long i = 0; i < static_cast<long>(general_triangles.size()); ++i)
{
TrianglePointer tri = general_triangles[i];
if (tri.GetClassification() == TO_CLASSIFY)
{
bool tri_has_correct_normal = true;
// --- Construct tree once per thread ---
Tree tree(*(gp_boolean_operator->mp_group_manager));
if (tree.IsTriangleExternal(tri, tri_has_correct_normal))
{
tri.SetClassification(IS_EXTERNAL);
}
}
}
是否有关键字可以为每个线程构造一次树?
您建议改用 bood_thread_ptr 吗?
最佳答案
考虑像这样未经测试的代码:
#pragma omp parallel
{
// --- Construct one tree in each per thread ---
Tree tree(*(gp_boolean_operator->mp_group_manager));
#pragma omp for
for (long i = 0; i < static_cast<long>(general_triangles.size()); ++i)
{
TrianglePointer tri = general_triangles[i];
if (tri.GetClassification() == TO_CLASSIFY)
{
bool tri_has_correct_normal = true;
if (tree.IsTriangleExternal(tri, tri_has_correct_normal))
{
tri.SetClassification(IS_EXTERNAL);
}
}
}
}
它表明您可以在可移植、独立于操作系统的 OpenMP 中完成所有这些操作,并且不会引入不必要的静态变量。
关于c++ - 在 OpenMP 中每个线程执行一次代码,无需默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40586798/