[英]Proper Cleanup if Thread Fails to Close - C++
當我的應用程序准備好關閉使用CreateThread
創建的步驟時,將執行以下算法:
_bCloseRequested = TRUE;
dwMsThen = ::GetTickCount();
do
{
::GetExitCodeThread( m_hThread, &dwExitCode );
dwMsNow = ::GetTickCount();
}
while( (dwExitCode == STILL_ACTIVE) && ((dwMsNow - dwMsThen) < 50000UL) );
如果線程在5個分配的秒內未能關閉,是否應該關閉線程句柄,或者是否允許它保持打開狀態? 謝謝。
首先,不要等待線程像這樣完成。 您將耗盡所有可用的CPU時間等待,這也是您的線程需要更長時間才能完成的缺點!
使用這樣的東西代替:
WaitForSingleObject(m_hThread, 50000);
也就是說:是否要讓線程繼續運行取決於線程的作用。 即使你的主應用程序開始做其他事情,它甚至可以運行嗎? 是否有關鍵的東西(文件,連接,數據庫......)打開,如果你殺死線程將保持打開狀態? 在決定是殺死線程還是讓它繼續運行之前,你必須考慮所有這些。
只需等待線程句柄。 如果花費太長時間,您應該暫停並終止您的應用程序,並修復任何導致該線程無法退出的錯誤。
static const DWORD TIMEOUT_VALUE(50000);
if (WaitforSingleObject(m_hThread, TIMEOUT_VALUE) != WAIT_OBJECT_0))
{
// thread did not exit in time, log and exit process
}
好問題。
有幾種方法可以解決這個問題。
我認為第一種方法是理想的方法。 那是永遠不會終止線程。 造成這種情況的原因是多方面的,但這里有一些大問題:
因此,采用這種方法,您將確定線程未關閉的原因,並解決該問題。 您可能會發現問題很嚴重。 您可能會發現死鎖,競爭條件等。靜態分析可以幫助您找到這些問題。
理想的方法是你應該始終堅持的方法。 在這樣做時,最好不要使用自旋鎖。 相反,線程句柄上的Wait()超時。 通過旋轉,你浪費資源,並從你正在等待的線程中竊取時間片。
但在現實世界中,在生產代碼中,如果其他一切都失敗,您需要一個后備措施。 您應該首先嘗試多種方法來觸發您的線程自行關閉。 如果一切都失敗作為絕對的最后手段,殺死線程。 但是由於殺死僵屍線程背后的危險,一旦你完成了這個,你應該重新啟動你的整個應用程序。 當您終止某個線程時,您可以將您的進程置於非確定性狀態。 所以重新開始。 記錄錯誤消息,關閉應用程序,然后重新開始。
都不是。 你應該修復任何阻止線程干凈地退出並簡單地加入它的東西。 其他一切都只是一個黑客。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.