簡體   English   中英

如果線程無法關閉則進行適當的清理 - C ++

[英]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
}

好問題。

有幾種方法可以解決這個問題。

我認為第一種方法是理想的方法。 那是永遠不會終止線程。 造成這種情況的原因是多方面的,但這里有一些大問題:

  1. 如果您的線程擁有同步對象,則不會釋放它們
  2. RAII對象沒有機會清理
  3. 分配的內存不會被釋放
  4. 如果您正處於certian內核調用的中間,則可能會影響整個應用程序

因此,采用這種方法,您將確定線程未關閉的原因,並解決該問題。 您可能會發現問題很嚴重。 您可能會發現死鎖,競爭條件等。靜態分析可以幫助您找到這些問題。

理想的方法是你應該始終堅持的方法。 在這樣做時,最好不要使用自旋鎖。 相反,線程句柄上的Wait()超時。 通過旋轉,你浪費資源,並從你正在等待的線程中竊取時間片。

但在現實世界中,在生產代碼中,如果其他一切都失敗,您需要一個后備措施。 您應該首先嘗試多種方法來觸發您的線程自行關閉。 如果一切都失敗作為絕對的最后手段,殺死線程。 但是由於殺死僵屍線程背后的危險,一旦你完成了這個,你應該重新啟動你的整個應用程序。 當您終止某個線程時,您可以將您的進程置於非確定性狀態。 所以重新開始。 記錄錯誤消息,關閉應用程序,然后重新開始。

都不是。 你應該修復任何阻止線程干凈地退出並簡單地加入它的東西。 其他一切都只是一個黑客。

暫無
暫無

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

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