簡體   English   中英

退出進程時等待線程完成

[英]Waiting on threads to finish while quitting the process

在一個簡單的問題上沒有找到直接令人滿意的答案:

給定多個線程正在運行,是否存在一種通用/正確的方法來等待它們在退出進程時完成? 還是“在這種情況下是否可以定時等待?”

是的,我們嘗試向線程發出結束信號,但可以觀察到,在進程退出期間,其中一些線程趨於停頓。 我們最近進行了討論,因此決定擺脫“任意等待”:

m_thread.quit();          // the way we had threads finished
m_thread.wait(kWaitMs);   // with some significant expiration (~1000ms)

m_thread.quit();          // the way we have threads finished now
m_thread.wait();          // wait forever until finished

我知道應該選擇kWaitMs常數,該常數與一個不間斷的“作業周期”成正比,以使線程完成。 假設,如果線程在10毫秒內處理某些數據塊,那么我們可能應該等待100毫秒以對退出信號做出響應,如果它仍然不退出,那么我們就不再等待。 只要退出程序並且不再關心,我們就不會在這種情況下等待。 但是有些工程師不理解這種“范式”,而是希望最終等待。 請注意,在本例中,卡在客戶端計算機內存中的程序進程將在下次啟動程序時引起問題,以確保不要提及日志將無法正確完成以作為錯誤進行處理。

是否可以回答有關退出進程的正確線程的問題?

Qt / API是否提供了一些幫助來更好地解決線程掛起的問題,所以我們可以記錄下原因了嗎?

PS Mind,我很清楚為什么強制終止線程是錯誤的,以及如何做到這一點。 我猜這個問題不是關於同步,而是關於運行大量我們代碼以及框架和OS代碼的線程的有限確定性。 操作系統不是實時的,對:Windows / MacOS / Linux等。

PPS所有有問題的線程都有事件循環,因此它們響應QThread::quit()

是的,我們嘗試向線程發出結束信號,但可以觀察到,在進程退出期間,其中一些線程趨於停頓。

那是你真正的問題。 您需要弄清楚為什么某些線程會停頓,並對其進行修復,以使它們不會停頓,並始終在應有的情況下可靠地退出。 (他們退出的確切時間並不重要,只要他們在合理的時間內退出即可,即在用戶厭倦等待並強制退出整個應用程序之前)

如果不這樣做,則無法可靠地關閉應用程序,因為您無法安全地釋放線程可能仍在訪問的任何資源。 必須100%保證在主線程調用該線程使用的任何對象的析構函數之前已退出線程(例如,與該線程關聯的QThread對象)

綜上所述:不要因為等待超時或強行終止線程而打擾游戲; 所得到的只是一個有時會在關機時崩潰的應用程序。 使用無限期等待,並確保在主線程請求線程之后總是(總是!)退出線程,因為這是實現可靠關閉順序的唯一方法。

暫無
暫無

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

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