一、介紹:(與進程一樣,由兩部分組成:線程內核對象,地址空間(堆棧)),但線程的開銷比線程小很多;能簡化用戶界面;充分利用CPU。
二、線程函數:
a) 線程進入點函數:
DWORD WINAPI ThreadFunc(PVOID, pvParam){
DWORD dwResult = 0 ;
…
return (dwResult);
}
b) 主線程進入點函數:main, wmain, WinMain, wWinMain
c) 必須有返回值
三、創建線程的函數:
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa, //NULL,默認安全屬性
DWORD cbStack, //設定地址空間大小,可以使用鏈接程序的/STACK開關控制
PTHREAD_START_ROUTINE pfnStartAddr, //線程函數的地址
PVOID pvParam, //可用於傳值,但是,如果是局部變量傳入,可能導致訪問違例,使用線程同步技術來處理!
DWORD fdwCreate,//=NULL,立即調度;=CREATE_SUSPENDED,暫停執行
PDWORD pdwThreadID);//可傳遞NULL,但win98不行!
四、建議使用CRT函數創建線程:_beginthreadex , _endthreadex. (TLS線程本地存儲),但不建議使用_beginthread和_endthread。
unsigned long _beginthreadex(
void *security,
unsigned stack_size,
unsigned (*start_address)(void *),
void *arglist,
unsigned initflag,
unsigned *thrdaddr);
五、終止線程運行,方法:
a) 線程函數返回(最好)
b) ExitThread(最好不用,C++資源未釋放,但內存堆棧被撤銷)
c) TerminateThread(應避免使用,內存堆棧不被撤銷)
d) 包含線程的進程終止。
六、查詢線程
a) 是否已經終止:
BOOL GetExitCodeThread(HANDLE hThread, //線程句柄
PDWORD pdwExitCode);//如線程結束,則指向返回值,否則=STILL_ACTIVE
b) 獲取進程/線程的僞句柄(當前調用函數的句柄),CloseHandle將失效:
HANDLE GetCurrentProcess();
HANDLE GetCurrentThread();
c) 獲取ID:
DWORD GetCurrentProcessId(); DWORD GetCurrentThreadId();
d) 將僞句柄變成實句柄DuplicateHandle:
HANDLE hThreadParent;
BOOL DuplicateHandle(
GetCurrentProcess(),
GetCurrentThread(),
GetCurrentProcess(),
&hThreadParent,
0, FALSE, DUPLICATE_SAME_ACCESS);