C6、線程

一、介紹:(與進程一樣,由兩部分組成:線程內核對象,地址空間(堆棧)),但線程的開銷比線程小很多;能簡化用戶界面;充分利用CPU

 

二、線程函數:

a)         線程進入點函數:

DWORD WINAPI ThreadFuncPVOID, 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);

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