Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何停止在共享库中实现的阻塞pthread_join()_C++_Multithreading_Gcc_Pthreads_Pthread Join - Fatal编程技术网

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

C++ 如何停止在共享库中实现的阻塞pthread_join(),c++,multithreading,gcc,pthreads,pthread-join,C++,Multithreading,Gcc,Pthreads,Pthread Join,我的代码在程序退出之前从第三方库调用函数。不幸的是,被调用的函数阻塞了主线程,这是由库中的pthread\u join()引起的 由于它在我无法控制的库中,我正在考虑如何中断它,以便主线程可以继续运行 使用gdb附加信息: 0x00007ffff63cd06d in pthread_join (threadid=140737189869312, thread_return=0x0) at pthread_join.c:89 89 lll_wait_tid (pd->

我的代码在程序退出之前从第三方库调用函数。不幸的是,被调用的函数阻塞了主线程,这是由
库中的
pthread\u 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。您可以将调用线程设计为等待一定的时间,然后超时。在超时情况下,如果不需要,可以忽略结果,或者可以设计一些方法来检查并在以后获得结果。您还可以让调用库的线程对结果执行任何需要执行的操作,以便调用线程不必担心它


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

如果调用
退出
,进程将在不关闭其他线程的情况下终止

如果正在等待的线程有一个
pthread\u t
句柄,您可能可以对其调用
pthread\u cancel
,但如果应用程序和库不准备处理线程取消,则会导致其他问题。(取消线程没有
pthread\u join
将没有帮助,因为关闭将在
pthread\u join
等待的同一线程上阻塞。)


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

可能是因为一个很好的原因才调用
pthread\u join()
。即使您以某种方式成功地击败了该调用,结果也可能是崩溃或其他错误行为,因为它等待的线程可能仍然处于活动状态,并且在进程退出期间被破坏时尝试使用数据结构。一个更好的方法可能是调查
pthread\u join()
调用等待的线程没有退出的原因——如果可以解决这个问题,那么
pthread\u join()
调用将快速返回,问题将得到妥善解决,您可以使用覆盖
pthread\u join
方法的
LD\u preload
预加载共享库。这几乎肯定是灾难性的。@JeremyFriesner谢谢,Jeremy。我完全理解你的建议,显然这也是我一直在努力的目标。实际上,这个问题源于我将glibc2.12更改为glibc2.14。库中的函数运行良好,在GLIBC 2.12中不调用
pthread\u join
。在我转到Glibc2.14(对于其他一些库)之后,这一期就出版了。你对可能的原因有什么线索吗?库如何知道哪个线程是主线程?它不是阻止了之前调用库函数的特定线程吗?谢谢,David。实际上,在我的主线程中,我分离了一个调用库的线程。我发现当分离的线程被销毁时,库中的阻塞线程仍然存在,从而阻塞了主线程。我很好奇为什么会发生这样的事情。我不明白你所说的“阻止主线”到底是什么意思。很抱歉把你弄糊涂了。所谓“阻塞主线程”,我的意思是,即使程序到达
main()
@lichgo中的最后一行,它也会退出,这可能是因为库仍在做它认为重要的事情。它提供某种关机功能吗?嗨,大卫。实际上,我调用的函数正是它的关闭函数。它在glibc2.12中运行良好。在我转到Glibc2.14之后,这个问题就产生了。