gpt4 book ai didi

c++ - 在 Openmp (C++) 中销毁线程

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:45 29 4
gpt4 key购买 nike

是否可以销毁 OpenMP 创建的线程?程序启动时,只有一个线程。在并行化部分之后,由于有一个线程池,多个线程仍然存在。有没有办法在并行部分运行后销毁这个池?

我问是因为我在动态库中使用 OpenMP,并且在线程运行时无法关闭库句柄(程序会出现段错误)。

谢谢

更多解释:我将所有并行化代码放入模块(共享库)中。然后我加载模块并将派生自抽象基类的类传递给它。该模块然后并行“运行”该类。这样,我就可以不使用并行化、OpenMP、MPI 或其他任何东西,并且可以在运行时甚至即时更改并行方案。但是 OpenMP 不会破坏线程,当需要手动 dlclose 库时,它会出现段错误,因为资源是从线程下面破坏的(我相信)。让程序在不关闭库的情况下完成目前可能是可以的,但是将来可能仍然会想要手动关闭库(考虑即时更改方案)。希望这是有道理的:)谢谢

最佳答案

目前,OpenMP 规范并未赋予用户任何控制线程何时被销毁的能力。您所说的内容非常有趣,在任何讨论规范的 OpenMP 语言委员会 session 上都没有被提及。你能提供更多关于你在做什么和问题是什么的信息吗?这将有助于将此讨论提交给委员会。

编辑添加 3/7 -

好的 - 这是一个似乎有效的简单示例,它可能会解决您的问题:

$> cat prog.c  
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(void)
{
void (*f)(void);
void *handle;

handle = dlopen("./shared.so", RTLD_NOW);
if (!handle) {
printf("*** dlopen error - %s\n", dlerror());
abort();
}

f = dlsym(handle, "foo");
if (!f) {
printf("*** dlsym error - %s\n", dlerror());
abort();
}
f();

if(dlclose(handle)) {
printf("*** dlclose error - %s\n", dlerror());
abort();
}
return 0;
}

$> cat shared.c
#include <omp.h>
#include <stdio.h>

void foo(void)
{
int i;

puts("... in foo\n");

#pragma omp parallel for
for (i=0; i<10; i++)
printf("t#: %i i: %i\n", omp_get_thread_num(), i);

puts("... exiting foo");
}

$> gcc -rdynamic -fopenmp prog.c -ldl -o prog
$> gcc -c -fopenmp -fPIC -o shared.o shared.c
$> ld -shared -o shared.so shared.o
$> ./prog
... in foo

t#: 2 i: 4
t#: 2 i: 5
t#: 3 i: 6
t#: 3 i: 7
t#: 0 i: 0
t#: 0 i: 1
t#: 4 i: 8
t#: 4 i: 9
t#: 1 i: 2
t#: 1 i: 3
... exiting foo

虽然主程序 (prog.c) 中没有 OpenMP 代码,但我使用 -fopenmp 标志编译了它。这意味着将在调用实际使用 OpenMP 的共享库之前设置 OpenMP 环境。这似乎解决了执行 dlclose 的问题,因为环境仍然存在。它还允许通过首次使用 OpenMP 获得的线程保留下来以供后续使用。这是否可以解决您的问题(或者仅适用于这个简单的示例)?

关于c++ - 在 Openmp (C++) 中销毁线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200418/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com