グローバルファイル記述子でfcloseを呼び出すと、プログラムがハングします。Linux上でクローンされたスレッドの後でfcloseがハングする
これは、クローンによって作成された複数のスレッドの終了後に発生しました。以下は
配列であるFIDと
FILE * fid = fopen("filename", "w");
...
for(int i=0; i<4; i++){
clone((int (*)(void*))do_work, stack[i], CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|SIGCHLD|CLONE_CHILD_CLEARTID|CLONE_PARENT_SETTID|CLONE_IO, NULL, &(ctid[i]), NULL, &(ctid[i]));
}
...
fclose(fid);
非スレッドを扱っています。
straceから、プログラムは "main_arena"を待つfutexでハングします。私はこれがglibcの中にいくつかのmutexであるべきだと思う。
バックトレース:
#0 0x0000003f09edf9ee in __lll_lock_wait_private() from /lib64/libc.so.6
#1 0x0000003f09e76d31 in _L_lock_5478() from /lib64/libc.so.6
#2 0x0000003f09e71c8d in _int_free() from /lib64/libc.so.6
#3 0x0000003f09e7273b in free() from /lib64/libc.so.6
#4 0x0000003f09e60d5b in [email protected]@GLIBC_2.2.5() from /lib64/libc.so.6
これはglibcの2.12とLinux上のglibc 2.5、ではなくて、Linux上で起こります。
このようにclone()を使ってスレッドを作成することができないのかどうかは疑問です。 NPTLでは、set_robust_futex()やスレッドローカルストレージの設定など、もっと多くのことが行われます。
ありがとうございます!