【发布时间】:2019-01-14 03:26:22
【问题描述】:
我的代码在程序退出之前从第三方库调用了一个函数。不幸的是,被调用的函数阻塞了主线程,这是由.so 库中的pthread_join() 引起的。
由于它在库中,这是我无法控制的,我正在徘徊如何打破它,以便主线程可以继续。
附加使用gdb的信息:
0x00007ffff63cd06d in pthread_join (threadid=140737189869312, thread_return=0x0)
at pthread_join.c:89
89 lll_wait_tid (pd->tid);
Missing separate debuginfos, use: debuginfo-install keyutils-libs-1.4-5.el6.x86_64 krb5-libs-1.10.3-65.el6.x86_64 libcom_err-1.41.12-23.el6.x86_64 libselinux-2.0.94-7.el6.x86_64 openssl-1.0.1e-57.el6.x86_64
提前致谢。
【问题讨论】:
-
大概它调用
pthread_join()是有充分理由的。即使您以某种方式成功击败了该调用,结果也可能是崩溃或其他不当行为,因为它正在等待的线程可能仍然处于活动状态并尝试使用数据结构,而它们在进程退出期间被拆除。更好的方法可能是调查为什么pthread_join()调用正在等待的线程没有退出 - 如果你能解决这个问题,那么pthread_join()调用将很快返回,问题将得到妥善解决。跨度> -
虽然我同意上述评论,但您可以使用覆盖
pthread_join方法的LD_PRELOAD预加载共享库。 -
那几乎肯定是灾难性的。
-
@JeremyFriesner 谢谢,杰里米。我完全理解你的建议,显然这也是我一直在努力的目标。实际上这个问题源于我从 GLIBC 2.12 到 GLIBC 2.14 的更改。库中的函数运行良好,在 GLIBC 2.12 中不会调用
pthread_join。在我迁移到 GLIBC 2.14(对于其他一些库)之后,就产生了这个问题。您对可能的原因有任何线索吗? -
库如何知道哪个线程是主线程?它不是阻塞了一些之前碰巧调用库函数的特定线程吗?
标签: c++ multithreading gcc pthreads pthread-join