2013-11-26 151 views
0

考慮一個多線程的Windows服務器應用程序。對於一般性起見,我們假設所有的線程在運行相同的功能:正常終止線程

DWORD WINAPI threaded_function(LPVOID p) 
{ 
    while (TRUE) { // do things } 
} 

而且,讓我們假設我們保持引用所有這些線程。 優雅終止的最佳做法是什麼? (請記住,作爲一個服務,我們有着一個未知數量的服務和任何種類的進程終止方法中的過程是沒問題的)

我最好的猜測是:

  1. 塗改在while (TRUE)聲明,與while(global_event.not_signaled())where global_event是包裹Win32Event對象,並呼籲該方法的類的實例是顯而易見的)

  2. 現在,實現終端功能如下:

    global_event.set();睡眠(/ *在這裏等候什麼時間?* /); thread_container.terminate_all();

我們的限制,是應用程序最終必須完成這一切線程的執行,並釋放它的所有虛擬機和中資源是線程的內核對象。

有沒有更好的方法來做到這一點?指定方法有缺點嗎?

+0

一個常用的方法是測試每個線程標誌並在設置後退出函數。使用窗口循環並退出WM_QUIT消息是實現它的一種方法。 –

+1

作爲一個方面說明:如果'//做的事情'很長,那麼如果可以停止執行中間代碼,則可能需要在整個代碼的各個點檢查'global_event'。否則,您必須等待完整的循環體完成。 – crashmstr

+1

沒有合理的時間等待。如果後臺線程無法關閉,您別無選擇,只能終止該進程。終止線程只會破壞數據。 –

回答

1

您可以創建一個互斥體,並把它的調用者線程上,如:

void caller(){ 
HANDLE mutex; 
CreateMutex(mutex); 

WaitForSingleObject(mutex); // take the mutex ownership 

createThread(threadedfunction, mutex); 

// do things 

ReleaseMutex(mutex); 

//end 
} 

並在您threadedfunction等待等的剝離:

void threadefunction(HANDLE mutex){ 

    while(WaitForSingleObject(mutex,1)==WAIT_TIMEOUT){ 
    // do things 
    } 
    ReleaseMutex(mutex); 
} 

這樣你threadedfunction將保持乳寧而無法使用互斥鎖時,waitforsingleobject將以1毫秒的等待超時,然後執行操作,直到它可以接受互斥鎖並退出。

+1

在終止時發出的等待事件比較常見,只是更有意義,而不是超時自己的互斥量。 –

+0

但是如何在事件未發出信號時繼續運行流程?如果我正在等待用WaitForSingleObject(INFINITE)發送信號,那麼在等待的時候沒有運行別的東西... –

+1

顯然,你不會使用'INFINITE',你會使用超時而不是,如果等待在事件報告'WAIT_OBJECT_0'上。 –