如何停止在共享库中实现的阻塞pthread_join()
How to stop a blocking pthread_join() implemented in a shared library
我的代码在程序退出之前从第三方库调用一个函数。不幸的是,被调用的函数阻塞了主线程,这是由.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
调用在您的环境中无限期等待(也就是说,为什么其他线程没有终止),并解决这个问题。
相关文章:
- 在std::thread中,joinable()然后join()线程安全吗
- join() 失败,如果在线程内部调用 io_context.run()
- 在 c++11 中为 pthread 设置调度参数
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- pthread只有在线程数量较少时才可以正常工作
- pthread执行时间比顺序执行时间差
- 使用 -pthread 如何不违反 ODR 规则?
- 使用 pthread 的多线程
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 锁定步进pthread互斥
- Pthread段错误,使用指向main中变量的指针
- pthread导致的内存泄漏
- GCC:--静态链接到pthread的整个存档配方在最近的GCC版本中停止工作
- std::future::get()或std::future::wait()是std::thread::join()的替
- 正确地编写一个类,并将pthread与vlc库和c++一起使用
- 直接读取 pthread 互斥锁的所有者字段是否安全?
- 为什么 pthread 会减慢代码速度?
- C++/pthread/join 错误消息的含义 "what(): Invalid argument"
- 在主函数中调用join子函数pthread