如何停止在共享库中实现的阻塞pthread_join()

How to stop a blocking pthread_join() implemented in a shared library

本文关键字:pthread join 何停止 共享 实现      更新时间:2023-10-16

我的代码在程序退出之前从第三方库调用一个函数。不幸的是,被调用的函数阻塞了主线程,这是由.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

提前谢谢。

该库的设计目的是让调用线程等待完成某些操作。既然你不能改变库的设计,就从一个没有其他事情可做的线程中调用库

通过设计交互的方式,您可以获得您想要的任何语义。如果您希望调用线程稍后在方便的时候获得结果,可以使用promise/future。您可以将调用线程设计为等待一定的时间,然后超时。在超时的情况下,如果不需要,可以忽略结果,或者可以设计一些方法来检查并稍后获得结果。你也可以让调用库的线程对结果做任何需要做的事情,这样调用线程就不必担心了

只需隔离你无法控制的代码,并围绕它编写你需要的任何代码,以获得你的代码所需的行为。库需要调用它的线程等待它完成,所以隔离调用它的螺纹,让库拥有它想要的东西。

如果调用exit,进程将终止,而不会关闭其他线程。

如果您为正在等待的线程有一个pthread_t句柄,您也许可以对其调用pthread_cancel,但如果应用程序和库没有准备好处理线程取消,则会导致其他问题。(取消线程执行pthread_join将没有帮助,因为关闭将在pthread_join等待的同一线程上阻塞。)

一般来说,最好弄清楚为什么pthread_join调用在您的环境中无限期等待(也就是说,为什么其他线程没有终止),并解决这个问题。