展开函数调用

时间:2010-02-15 05:14:45

标签: c++ python multithreading boost-python

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

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

1 个答案:

答案 0 :(得分:0)

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