破坏Openmp中的线程(C ++)

时间:2011-03-04 23:28:01

标签: c++ multithreading openmp dynamic-library

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

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

由于

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

1 个答案:

答案 0 :(得分:3)

此时,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时获得的线程留在后面使用。这是否适用于解决您的问题(或者这只适用于这个简单的示例)?