2010-02-15 70 views
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線的行動2調用是這可能任何方式?

我應該提到,我無法編輯線程2中的操作,即我無法編輯管理該線程的庫。 我可以修改python的GIL鎖定,可能是一個嘗試鎖定或一個定時鎖定,或者甚至可能是一個等待條件,但這將是很難拉開。

我想最好的解決辦法是修改蟒蛇伺候吉爾和名稱的條件,當我想要取消其對GIL等待我的線程1可以發出信號。但在走下那條路線之前,我想知道我是否缺少任何東西。

+0

所以,只是爲了澄清:定時器處理程序析構函數在你的控制之外? – Roman 2010-02-15 05:38:12

+0

是正確的,在我的代碼中沒有任何東西可以保證我在調用動作1之前不會從線程2調用動作2. – Charles 2010-02-15 05:41:24

+0

抱歉沒有真正回答您的真實問題,是的是破壞定時器的代碼已經超出我的控制。我一直在想這個問題,我認爲,大腦被燒燬了 – Charles 2010-02-15 05:51:17

回答

0

如果你正在銷燬計時器處理程序,我想你會退出程序。在嘗試退出並開始查殺定時器之前,您可以設置一個標誌來防止操作1並使線程1自行終止?我希望我正確地閱讀你的圖,因爲它與文本不完全匹配...

+0

問題是,只要我從python跨越到我的C++代碼中,那麼事情就容易發生。所以爲了這個工作,我需要在python調用我的C++應用程序時設置'不允許操作2嘗試鎖定gil'標誌。 我試着在我的程序中設置一個標誌來阻止呼叫處理程序鎖定GIL,但我所做的只是讓死鎖窗口變小一點。 順便說一句動作1是定時器銷燬 – Charles 2010-02-15 05:57:32

+0

除非你有辦法在銷燬任何東西之前停止所有的定時器,我認爲你被卡住了,可能需要採取一種完全不同的方法。你說你想連接兩個庫。我假設他們都是C++庫。您可能需要添加第三個線程,它可以充當Python的代理,並且是唯一允許與GIL混合的線程。換句話說,像多線程應用程序一樣處理大多數GUI:將所有GUI工作限制爲一個線程並讓其他代理通過。如果沒有更好的想法,我不能真正推薦更多的任務。 – 2010-02-18 02:06:12

+0

這是我可能最終採取的一條路線,雖然我不喜歡這個想法,它會很容易出現問題:( 我確實在相關搜索中發現了這個問題http://stackoverflow.com/questions/2135457/如何寫一個包裝函數和成員函數執行某些代碼鱈魚 這表明它可以釋放gil一旦你在Cpp世界只要你拿它回去的時候,所以我一直在調查這種方法,謝謝 – Charles 2010-02-24 04:06:10