進程包括:
1)私有的虛地址空間;
2)可執行程序(代碼與數據);
3)打開系統資源列表句柄;
4)安全訪問標誌;
5)進程ID;
6)至少有一個執行線程;
線程包括:
1)一組CPU寄存器狀態;
2)兩個堆棧(系統態與用戶態);
3)TLS(線程局部存儲區);
4)線程ID;
5)安全特性;
因此進程是不活潑的,它從來不執行任何東西,是線程的容器;
線程的分類:1)用戶界面線程;2)工作線程;
一般說來一個程序是由一個UI線程和多個work線程組合的,UI線程中進行消息處理(getmessage()),工作線程處理業務邏輯;
線程函數的聲明:
DWORD WINAPI TreadFunc(LPVOID);
線程的創建:
HANDLE CreateThread(。。。);
這裏需要注意一點線程ID與進程ID一樣是可重複使用的,具有一定的不可信性,因此最好操作他們時使用內核對象句柄;
線程的終止:
1)線程函數返回;
2)調用了ExitThread函數;
3)另一個線程調用了TerminateThread()函數;
4)包含線程的進程終止運行;
線程返回後要做的一些事情:
始終將線程設計成這樣的形式,即當想要線程終止運行時,它們就能夠返回;如果線程能夠返回,就可以確保下列事項的實現;
1)線程函數中創建的所有C++對象均將通過它們的析構函數正確撤銷;
2)os將正確釋放線程堆棧使用的內存;
3)os將線程的退出代碼設置爲線程函數的返回值;
4)os將遞減線程內核對象的使用計數;
ExitThread和TerminateThread函數基本在設計良好的程序中都不使用,原因如下:
ExitThread不能讓函數中的C++對象正確的撤銷;在ms的VC中可以用VC++運行庫中的_endthreadex替代;
TermianteThread
1)他是異步操作,並不能保證想終止的線程已經終止了;
2)線程終止時,DLL通常接受通知,但改函數強迫線程終止,DLL不接收通知,這也能阻止適當的清除;
3)另外在擁有被終止線程的進程結束前,該線程的堆棧不會被釋放;
C/C++運行庫的考慮
CreateThread與_beginthreadex函數的區別
前者是操作系統的函數,後者是C/C++運行庫函數,如果要使用到C/C++運行庫中的一些線程不安全函數需要用_beginthreadex函數替代CreateThread函數來創建線程;
進程和線程的句柄和僞句柄
句柄:CreateProcess和CreateThread函數返回值
僞句柄:GetCurrentProcess();GetCurrentThread();
注意將僞句柄傳入CloseHandle(..)會忽略並返回false;
將僞句柄轉換爲實句柄:DuplicateHandle(...)該函數會遞增特定對象的使用計數,因此完成後應該對該對象進行釋放;