我的代码是在程序退出之前从第三方库调用一个函数。不幸的是,被调用的函数阻塞了主线程,这是由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。您可以将调用线程设计为等待一定时间然后超时。在超时情况下,如果不需要结果,则可以忽略该结果,或者可以设计某种方式来检查并稍后获得结果。您还可以让调用库的线程对结果做任何需要做的事情,以便调用线程不必担心它。
只需隔离您无法控制的代码并在其周围编写任何代码,即可获得所需的行为。库需要调用它的线程来等待它完成,因此请隔离调用它的线程,并让库具有所需的内容。