考慮一個多線程的Windows服務器應用程序。對於一般性起見,我們假設所有的線程在運行相同的功能:正常終止線程
DWORD WINAPI threaded_function(LPVOID p)
{
while (TRUE) { // do things }
}
而且,讓我們假設我們保持引用所有這些線程。 優雅終止的最佳做法是什麼? (請記住,作爲一個服務,我們有着一個未知數量的服務和任何種類的進程終止方法中的過程是沒問題的)
我最好的猜測是:
塗改在
while (TRUE)
聲明,與while(global_event.not_signaled())
(where global_event
是包裹Win32
Event
對象,並呼籲該方法的類的實例是顯而易見的)現在,實現終端功能如下:
global_event.set();睡眠(/ *在這裏等候什麼時間?* /); thread_container.terminate_all();
我們的限制,是應用程序最終必須完成這一切線程的執行,並釋放它的所有虛擬機和中資源是線程的內核對象。
有沒有更好的方法來做到這一點?指定方法有缺點嗎?
一個常用的方法是測試每個線程標誌並在設置後退出函數。使用窗口循環並退出WM_QUIT消息是實現它的一種方法。 –
作爲一個方面說明:如果'//做的事情'很長,那麼如果可以停止執行中間代碼,則可能需要在整個代碼的各個點檢查'global_event'。否則,您必須等待完整的循環體完成。 – crashmstr
沒有合理的時間等待。如果後臺線程無法關閉,您別無選擇,只能終止該進程。終止線程只會破壞數據。 –