關於createthread和closehandle

一,在程序中建立線程的概念

      對於一個進程而言,在進程建立後,同時系統也會爲進程自動分配一個主線程。拿Main函數而言,當Main函數執行完後,此時主線程就退出了,主線程退出也同時意味着進程結束。

二,線程、內核對象、內核對象引用計數

      1.創建一個線程有幾種方法,這裏我們先學習的是利用CreateThread()函數創建線程,此函數的參數及具體用法參見MSDN。如果創建線程成功,函數則返回一個新的線程句柄。(根據《Windows核心編程》,線程創建時,系統設置線程內核對象的引用計數爲1,在Create函數返回前,將會打開線程句柄,所以線程的內核對象引用計數+1)

=================================================================================

CreateThread後那個線程的引用計數不是1,而是2。  
   
  creating   a   new   process   causes   the   system   to   create   a   process   kernel   object    
  and   a   thread   kernel   object.   At   creation   time,   the   system   gives   each   object    
  an   initial   usage   count   of   1.   Then,   just   before   CreateProcess   returns,   the    
  function   opens   the   process   object   and   the   thread   object   and   places   the    
  process-relative   handles   for   each   in   the   hProcess   and   hThread   members   of    
  the   PROCESS_INFORMATION   structure.   When   CreateProcess   opens   these   objects    
  internally,   the   usage   count   for   each   becomes   2.                                                  ---摘自《Windows核心編程》

=================================================================================

三,CloseHandle()用法

      1.CloseHandel(ThreadHandle );
只是關閉了一個線程句柄對象,表示我不再使用該句柄,對該句柄不感興趣,即不對這個句柄對應的線程做任何干預了。並沒有結束線程,線程本身還在繼續運行。如果你CreateThread以後需要對這個線程做一些操作,比如改變優先級,被其他線程等待,強制TermateThread等,就要保存這個句柄,使用完了再CloseHandle()。

      2.爲什麼要CreateThread()和CloseHandle()緊挨配套使用

一方面,所有的內核對象(包括線程Handle)都是系統資源,用了要還的,也就是說用完後一定要CloseHandle關閉之,如果不這麼做,你係統的句柄資源很快就用光了,另一方面,由於CreateThread()後線程內核對象的引用計數是2,在CloseHandle()引用計數-1之後,內核對象引用計數仍不爲0,不會被釋放,所以線程仍運行,直到線程函數執行完畢後,引用計數再-1,線程結束

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