在没有默认构造函数的OpenMP中,每个线程执行一次代码
Execute piece of code once per thread in OpenMP without default constructor
我尝试使用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中完成所有这些工作,并且您不需要引入不必要的静态变量。
应该可以了
gcc: static __thread
MSVC: static __declspec(thread)
然而,出于性能原因,手动处理它可能更好。使用大小与线程数相对应的向量,并使用线程数对向量进行索引。如果元素为NULL,线程必须构造它。
另请阅读:如何定义线程局部局部静态变量?
类似这样的东西(请注意,它是未经测试的,我自己从来没有使用过OMP,因为它没有提供我喜欢的控制程度,而不是实际发生的事情)。
std::vector<Tree *> trees;
trees.resize(omp_get_thread_limit());
#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 = trees[omp_get_thread_num()];
if (tree == NULL)
tree = new Tree(*(gp_boolean_operator->mp_group_manager));
if (tree->IsTriangleExternal(tri, tri_has_correct_normal))
{
tri.SetClassification(IS_EXTERNAL);
}
}
}
// delete trees afterwards
相关文章:
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 如何创建线程序列以按照启动顺序执行任务?
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 如何制作一个只能在一个线程上同时执行的函数?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 工作线程在执行太快后永久休眠
- 超时后,线程睡眠不会继续执行
- 如何将带有参数的方法传递给线程以执行?
- 将执行循环拆分为多个线程 (1-N-1-N-1..)
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- MFC执行线程问题
- Qt不能多次执行线程
- future::wait() 是否与 async() 执行线程的完成同步?
- std::线程何时执行线程
- 使用for循环执行线程
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?
- 在C++11中,"不代表执行线程"的线程有什么意义?
- C++ 线程执行时间和另一个线程中的执行线程