這是一個難以描述的問題,請讓我知道是否有什麼不清楚的地方。展開函數調用
我正試圖解決我的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線的行動2調用是這可能任何方式?
我應該提到,我無法編輯線程2中的操作,即我無法編輯管理該線程的庫。 我可以修改python的GIL鎖定,可能是一個嘗試鎖定或一個定時鎖定,或者甚至可能是一個等待條件,但這將是很難拉開。
我想最好的解決辦法是修改蟒蛇伺候吉爾和名稱的條件,當我想要取消其對GIL等待我的線程1可以發出信號。但在走下那條路線之前,我想知道我是否缺少任何東西。
所以,只是爲了澄清:定時器處理程序析構函數在你的控制之外? – Roman 2010-02-15 05:38:12
是正確的,在我的代碼中沒有任何東西可以保證我在調用動作1之前不會從線程2調用動作2. – Charles 2010-02-15 05:41:24
抱歉沒有真正回答您的真實問題,是的是破壞定時器的代碼已經超出我的控制。我一直在想這個問題,我認爲,大腦被燒燬了 – Charles 2010-02-15 05:51:17