Linux上克隆线程后fclose挂起

Linux上克隆线程后fclose挂起,linux,multithreading,clone,fclose,futex,Linux,Multithreading,Clone,Fclose,Futex,在全局文件描述符上调用fclose时,程序将挂起 它发生在克隆创建的几个线程退出之后 顺序如下: 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_C

在全局文件描述符上调用fclose时,程序将挂起

它发生在克隆创建的几个线程退出之后

顺序如下:

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);
这在使用glibc2.5的Linux上发生,但在使用glibc2.12的Linux上不会发生

我想知道这是否是因为我们不能像这样使用clone()创建线程。在NPTL中,还要做很多事情,比如设置健壮的futex()和设置线程本地存储


谢谢

我无法想象你会怎么想。stdio库在内部使用锁。锁特定于所使用的线程模型。您正在使用自己的线程模型,但希望stdio库的锁能够神奇地使用它。这显然不是一个合理的期望。

您的内核版本是什么

这似乎是一个内核错误

有关更多信息,请参阅和

#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 fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6