0

这是一个很难描述的问题,所以如果有任何不清楚的地方,请告诉我。

我正在尝试解决我的 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 可以发出信号。但在走这条路之前,我想知道我是否遗漏了什么。

4

1 回答 1

0

如果您正在销毁计时器处理程序,我认为您正在退出程序。在您尝试退出并开始终止计时器之前,您可以设置一个标志来阻止操作 1 并让线程 1 自行终止吗?我希望我没看错你的图表,因为它与文字不完全匹配......

于 2010-02-15T05:45:40.567 回答