現時点では、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を最初に使用して取得したスレッドを、その後の使用のために残しておくこともできます。これは問題を回避するために機能しますか(またはこれはこの単純な例でのみ機能しますか)?