簡體   English   中英

線程的優雅終止

[英]Graceful termination of a thread

考慮一個多線程的Windows服務器應用程序。 為了通用起見,讓我們假設所有線程都運行相同的功能:

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

另外,假設我們為所有這些線程保留引用。 優雅終止的最佳做法是什么? (請記住,作為一項服務,我們在未知數量的服務中共享一個流程,並且毫無疑問,任何一種流程終止方法都是可行的)

我最好的猜測是:

  1. while(global_event.not_signaled() )更改while (TRUE)語句( where global_event是包裝Win32 Event對象的類的實例,並且調用的方法是顯而易見的)

  2. 現在,實現終止功能,如下所示:

    global_event.set(); Sleep(/ *在這里等待的合理時間是什么?* /); thread_container.terminate_all();

我們的限制是,應用程序最終必須完成所有線程的執行,並釋放其所有VM和資源,其中包括線程的內核對象。

有什么更好的方法嗎? 指定的方法有什么缺點嗎?

您可以創建一個互斥鎖並將其放在調用者線程上,例如:

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);
}

這樣,您的線程函數將在無法獲取互斥體的情況下繼續運行,waitforsingle對象將在等待一毫秒的等待時間內超時並執行操作,直到可以獲取互斥體並退出。

暫無
暫無

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

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