進程與線程

進程包括:

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(...)該函數會遞增特定對象的使用計數,因此完成後應該對該對象進行釋放;

 

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