我的代码是在程序退出之前从第三方库调用一个函数。不幸的是,被调用的函数阻塞了主线程,这是由pthread_join()库中的.so引起的。

由于它在我无法控制的库内部,因此我在徘徊如何破坏它,以便主线程可以继续。

使用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。您可以将调用线程设计为等待一定时间然后超时。在超时情况下,如果不需要结果,则可以忽略该结果,或者可以设计某种方式来检查并稍后获得结果。您还可以让调用库的线程对结果做任何需要做的事情,以便调用线程不必担心它。

只需隔离您无法控制的代码并在其周围编写任何代码,即可获得所需的行为。库需要调用它的线程来等待它完成,因此请隔离调用它的线程,并让库具有所需的内容。

08-18 17:18