我正在開發一個專案,我們使用 pthread_create 創建了幾個子執行緒。執行緒創建邏輯不在我的控制范圍內,因為它由專案的其他部分實作。
每個執行緒執行一些需要超過 30 秒才能完成的操作。在正常情況下,該程式運行良好。但問題發生在程式終止時。當我收到 SIGINT 信號時,我需要盡快退出 main 。
當我呼叫 exit() 或從 main 回傳時,將呼叫退出處理程式和全域物件的解構式。而且我相信這些操作與正在運行的執行緒存在競爭條件。而且我相信有很多競爭條件,這使得解決所有這些問題變得困難。在我看來,有兩種解決方案。
- 呼叫 _exit() 并忘記所有資源的取消分配
- 當 SIGINT 存在時,關閉/殺死所有執行緒,然后從主執行緒呼叫 exit(),這將釋放資源。
我認為第一個選項會起作用,但我不想突然終止該程序。所以我想知道是否可以盡快終止所有子執行緒,以便退出處理程式和解構式可以執行所需的清理任務并終止程式。
我已經閱讀了這篇文章,如果您知道其他方法,請告訴我:POSIX API call to list all the pthreads running in a process
另外,讓我知道是否有任何其他解決方案可以解決此問題
uj5u.com熱心網友回復:
在程式退出之前你需要做什么?如果答案是“解除分配資源”,那么您無需擔心。如果您呼叫_exit,則程式將立即退出,作業系統將為您清理所有內容。
另請注意,您可以在信號處理程式中安全地執行的操作非常有限,因此不建議您嘗試自己執行任何清理操作。如果你有興趣,這里有一個你可以做什么的串列。但是,例如,您不能將檔案重繪 到磁盤(這是我能想到的唯一一件您可能合法地想要在這里做的事情)。那是沒有限制的。
uj5u.com熱心網友回復:
當我收到 SIGINT 信號時,我需要盡快退出 main 。
那是怎么定義的?因為當你收到這樣的一個信號時,沒有辦法“盡快退出”。
您可以設定標志,發布到信號量,或類似設定一個狀態,告訴其他執行緒是時候關閉了,或者您可以終止整個行程。
如果您選擇設定標志或類似的東西來告訴其他執行緒關閉,您設定這些標志并從您的信號處理程式回傳,并希望執行緒正常運行并且行程干凈地關閉。
如果您選擇終止執行緒,那么終止執行緒、終止行程或呼叫_exit(). 您不妨保持簡單并呼叫_exit().
當您必須在單個信號處理程式呼叫中做出決定時,您可以選擇的只有這些。選一個。
更好的解決方案是使用升級信號。例如,當你得到SIGQUITor時SIGINT,你設定標志或以其他方式告訴執行緒是時候清理并退出行程 -或者 else。然后,說五秒鐘后,無論關閉您的行程發送SIGTERM什么,“否則”就會發生。當你得到時SIGTERM,你的信號處理程式只是呼叫_exit()-那些執行緒有機會,他們把它搞砸了,這是他們的錯。或者您可以呼叫abort()生成核心檔案,并可能提供足夠的證據來修復不會關閉的惡意執行緒。
最后,五秒鐘后,管理程序將從軌道上取消該程序,SIGKILL以確保安全。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452551.html
