一些背景:
我有一个依赖于第三方硬件和闭源驱动程序的应用程序。驱动程序当前有一个错误,导致设备在随机时间后停止响应。这是由驱动程序中明显的死锁引起的,并中断了我的应用程序的正常运行,该应用程序处于始终在线的 24/7 高度可见的环境中。
我发现将 GDB 附加到进程,并立即从进程中分离 GDB 会导致设备恢复功能。这是我第一次表明驱动程序本身存在线程锁定问题。有某种竞争条件会导致死锁。附加 GDB 显然会导致一些线程重新洗牌,并可能将它们推出等待状态,导致它们重新评估它们的条件,从而打破死锁。
问题:
我的问题很简单:是否有一个干净的等待应用程序触发程序中的所有线程来中断它们的等待状态?肯定有效的一件事(至少在我的实现中)是发送一个 SIGSTOP,然后立即从另一个进程(即来自 bash)发送一个 SIGCONT:
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
这会在过程中触发虚假唤醒,一切都恢复生机。
我希望有一种智能方法可以触发我进程中所有线程的虚假唤醒。思考pthread_cond_broadcast(...)
但无法访问正在等待的实际条件变量。
这是可能的,还是依赖像kill
我唯一的方法这样的程序?