簡體   English   中英

展開函數調用

[英]Unwind a function call

這是一個很難描述的問題,所以如果有任何不清楚的地方,請告訴我。

我正在嘗試解決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的等待並釋放其堆棧以使其擺脫這種死鎖的危害。 盡管我擔心會深入到特定的OS實現中,但我想不出任何更好的解決方案。

換句話說,我想取消從1線的行動2調用這是在任何可能的方式?

我應該提到我無法編輯線程2中的操作,即無法編輯管理該線程的庫。 我可以將python的GIL鎖定修改為try鎖定或定時鎖定,或者甚至是條件等待,但這確實很難實現。

我想最好的解決方案是修改python以等待gil和一個命名條件,當我想取消對GIL的等待時,線程1可以發出信號。 但是在走那條路線之前,我想知道我是否缺少任何東西。

如果要銷毀計時器處理程序,我認為您正在退出程序。 在嘗試退出並開始終止計時器之前,可以設置一個標志來阻止操作1並使線程1終止嗎? 我希望我能正確閱讀您的圖表,因為它與文本不完全匹配...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM