一,在程序中建立線程的概念
對於一個進程而言,在進程建立後,同時系統也會爲進程自動分配一個主線程。拿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,線程結束