父線程結束時如何自動結束子線程

        首先要指出這裏的父線程不是主線程 這的確是個問題,也就是說怎麼才能保證父線程結束後其子線程也都退出.有人說在父線程結束前結束掉子線程不就行了嗎?但事實是,如何父線程被暴力時,根本無法正確處理子線程.個人認爲有兩種方法.

        一是在父線程中得到句柄,創建子線程時作爲參數傳給子線程,這樣子線程通過這個句柄可以知道父線程是否仍存活,如何已結束,則結束自身.

       父線程中:

HANDLE hParent=INVALID_HANDLE_VALUE;
if (!DuplicateHandle (GetCurrentProcess (),GetCurrentThread (),GetCurrentProcess (),&hParent,NULL,TRUE,DUPLICATE_SAME_ACCESS))
   printf ("get parent handle failed!/n");

CreateThread (&sa,0,thread_fun2,(LPVOID)hParent,NULL,NULL);

子線程中:

HANDLE hParent=(HANDLE)lpParam;
DWORD nCode;
do
{
   if (!GetExitCodeThread (hParent,&nCode))
   {
    printf ("get exit code failed!/n");
    printf ("error:%d/n",GetLastError ());
   }
   if (nCode!=STILL_ACTIVE)//父線程結束
    return 1;
   ....
}while (....);

         注意DuplicateHandle的參數,開始我圖省事將最後一個參數也設爲NULL,結果在子線程中調用GetExitCodeThread時會出錯,通過錯誤代碼知道是"拒絕訪問",也即沒有足夠權限,因此在得到父線程實句柄時一定要指定訪問權限.

        第一種其實有點應付的味道,性能不好,而且並不能算是完成了要求,當然以實時性要求不高時也可以.另一種方法是通過一個全局數組,或者一個創建父線程時作爲參數傳入的數組存儲所有建立的子線程句柄.這樣當要結束父線程時,就可以根據這個數組將所有記錄的子線程結束.有點浪費空間,不過性能肯定比第一種好,而且實時性也要好得多.

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章