这是一个难以描述的问题,如果有任何不清楚的地方,请告诉我。
我正在尝试解决我的C ++应用程序中可能存在的死锁情况,并且我无法可视化适当的解决方案。我试图连接的两个库给我的限制使我的问题非常复杂和麻烦,但它可以归结为一个简单的图表。很简单,我有这样的情况
Python | Thread 1 Thread 2
|
Action 1 -|-> GIL LOCK --> Random Calls
Action 2 | GIL LOCK <----------------------------- [Action 2]
| Action 1 -- signals ---> Do_Action_1
| Wait Forever Wait on Action 2
动作2碰巧是计时器触发,我正在使用的库有这个定时器代码,它将在一段时间后调用函数。
当我在销毁计时器处理程序时触发计时器时发生故障(操作1)。计时器处理程序将等待计时器完成其功能,并且计时器功能无法完成,因为它们正在等待调用python函数。为了进入python,他们需要获取定时器处理程序销毁操作所持有的GIL。
我想知道我是否可以从线程1中断其在GIL上的等待并解除其堆栈以使其摆脱这种死锁的危害。虽然我担心深入到特定的操作系统实现,但我想不出更好的解决方案。
换句话说,我想取消线程1中的Action 2调用。是否可以 ANY 方式?
我应该提一下,我无法编辑线程2中的操作,即我无法编辑管理该线程的库。 我可以修改python的GIL锁定,可能是一个尝试锁定或一个定时锁定,甚至可能是等待条件,但这很难实现。
我认为最好的解决方案是修改python以等待gil以及当我想取消其在GIL上等待时我的线程1可以发出信号的命名条件。但在走这条路之前,我想知道我是否遗漏了任何东西。
答案 0 :(得分:0)
如果你正在销毁计时器处理程序,我认为你正在退出程序。在您尝试退出并开始查杀计时器之前,您是否可以设置一个标志来阻止操作1并让线程1自行终止?我希望我正确地阅读你的图表,因为它与文本不完全匹配...