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

时间:2019-01-14 03:26:23

标签: c++ multithreading gcc pthreads pthread-join

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

谢谢。

2 个答案:

答案 0 :(得分:2)

该库旨在使调用线程等待完成。由于您无法更改库的设计,因此只需从没有其他操作的线程中调用库即可。

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

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

答案 1 :(得分:1)

如果您调用exit,则该过程将终止而不关闭其他线程。

如果对正在等待的线程有一个pthread_t处理,则可以在其上调用pthread_cancel,但是如果应用程序和库不准备处理线程取消,它将引起其他问题。 (取消线程不会pthread_join会有所帮助,因为关闭将随后阻塞pthread_join等待的同一线程。)

通常,找出为什么 pthread_join调用在您的环境中无限期等待(这就是为什么另一个线程没有终止的原因)可能是一个更好的主意,并且解决这个问题。