Joh*_*ove 11 c linux multithreading posix
一些背景:
我有一个依赖第三方硬件和闭源驱动程序的应用程序.驱动程序当前有一个错误导致设备在一段随机时间后停止响应.这是由于驱动程序中存在明显的死锁并中断了我的应用程序的正常运行,这是一个始终在24/7高度可见的环境.
我发现将GDB附加到进程,并立即从进程中分离GDB导致设备恢复功能.这是我第一次表明驱动程序本身存在线程锁定问题.存在某种导致僵局的竞争条件.附加GDB显然会导致一些线程重新调整,并可能将它们推出等待状态,导致它们重新评估其状态,从而打破僵局.
问题:
我的问题很简单:是否有一个干净的等待应用程序触发程序中的所有线程来中断其等待状态?确实有效的一件事(至少在我的实现上)是发送一个SIGSTOP,紧接着是来自另一个进程的SIGCONT(即来自bash):
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
Run Code Online (Sandbox Code Playgroud)
这会触发过程中的虚假唤醒,一切都恢复了生机.
我希望有一种智能方法可以触发我进程中所有线程的虚假唤醒.想想pthread_cond_broadcast(...)但无法访问等待的实际条件变量.
这是可能的,还是依赖于kill我唯一的方法?
您现在的操作方式可能是最正确,最简单的方法。内核中没有“唤醒给定进程中所有等待的futex”操作,这是您需要更直接地实现此目的的操作。
请注意,如果唤醒失败的“死锁”已进入,pthread_cond_wait但通过信号中断将其打破死锁,则该错误不会出现在应用程序中。它实际上必须在pthread条件变量中执行。glibc在其条件变量实现中已知未修复的错误;请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=13165和相关的错误报告。但是,您可能已经找到了一个新的,因为我不认为可以通过打破带有信号的futex等待来解决现有的已知问题。如果您可以将此错误报告给glibc错误跟踪器,那将非常有帮助。