c++ - 在 OpenMP 中每个线程执行一次代码,无需默认构造函数

标签 c++ multithreading openmp boost-thread

我尝试使用 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/

相关文章:

java - Android 上的 runOnUiThread() 和无限循环

将 c 顺序转换为 OpenMP 问题

c++ - 每个进程或每台计算机的线程 ID 是唯一的吗?

C++ 如何迭代定义为父类(super class)的 vector ,但调用子类方法?

C++ 包装模板函数

c++ - 如何决定是否使用超线程?

c# - 如何从另一个线程中止单元测试?

c++ - SFML - Opengl VAO 问题给我一个 (1282) 错误

c++ - C/C++ 中的数据并行库

c++ - Openmp 初始化 vector