是否可以销毁 OpenMP 创建的线程?当程序启动时,只有一个线程。在并行化部分之后,由于存在线程池,因此仍保留多个线程。并行部分运行后有什么方法可以销毁这个池吗?
我问是因为我在动态库中使用 OpenMP,并且在线程运行时无法关闭库句柄(程序将出现段错误)。
Thanks
更多解释:我将所有并行化代码放入模块(共享库)中。然后,我加载该模块并向其传递一个从抽象基类派生的类。然后该模块并行“运行”该类。这样,我就可以不使用并行化、OpenMP、MPI 或其他任何东西,并且可以在运行时甚至即时更改并行方案。但 OpenMP 不会破坏线程,当需要手动 dlclose 库时,它会出现段错误,因为资源是从线程下面破坏的(我相信)。现在让程序完成而不关闭库可能是可以的,但是将来可能仍然会出现想要手动关闭库的情况(考虑动态更改方案)。希望这是有道理的:) 谢谢
目前,OpenMP 规范没有为用户提供任何控制线程何时被销毁的能力。您所说的内容非常有趣,并且在任何 OpenMP 语言委员会讨论规范的会议上都没有被提及。您能否提供更多有关您正在做的事情以及问题所在的信息?将这一讨论提交给委员会将会有所帮助。
编辑添加 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 获得的线程保留下来以供后续使用。这是否可以解决您的问题(或者这仅适用于这个简单的示例)?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)