【问题标题】:fclose hang after cloned threads on Linux在 Linux 上克隆线程后 fclose 挂起
【发布时间】:2012-03-02 10:36:22
【问题描述】:

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

clone 创建的多个线程退出后发生。

以下是顺序:

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);

非线程处理fid。

从 strace 开始,程序挂在 futex 中等待“main_arena”。我认为这应该是 glibc 中的一些互斥锁。

回溯:

#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

这发生在使用 glibc 2.5 的 Linux 上,而不是使用 glibc 2.12 的 Linux 上。

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

谢谢!

【问题讨论】:

    标签: linux multithreading clone fclose futex


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你的内核版本是多少?

      这似乎是一个内核错误。

      请参阅futex_wait bugkernel patch 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-19
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多