这是一个很难描述的问题,所以如果有任何不清楚的地方,请告诉我。
我正在尝试解决我的 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 调用。这有可能吗?
我应该提到我无法编辑线程 2 中的操作,即我无法编辑管理该线程的库。我可以将 python 的 GIL 锁修改为可能是尝试锁或定时锁,甚至可能是等待条件,但这真的很难实现。
我想最好的解决方案是修改 python 以等待 gil 和一个命名条件,当我想取消它在 GIL 上的等待时,我的线程 1 可以发出信号。但在走这条路之前,我想知道我是否遗漏了什么。