1. 程式人生 > >C++ 建立執行緒的方法

C++ 建立執行緒的方法

c++開發過程中,建立執行緒是必不可少的,今天就給大家說說c++建立執行緒的方法,主要介紹我常用的2種方法。

第一種:CreateThread

HANDLE WINAPI CreateThread( 
	 LPSECURITY_ATTRIBUTES lpThreadAttributes,  
	 SIZE_T dwStackSize, 
	 LPTHREAD_START_ROUTINE lpStartAddress, 
	 LPVOID lpParameter,  
	 DWORD dwCreationFlags,  
	 LPDWORD lpThreadId);

函式說明:
第一個引數表示執行緒核心物件的安全屬性,一般傳入NULL表示使用預設設定。
第二個引數表示執行緒棧空間大小。傳入0表示使用預設大小(1MB)。
第三個引數表示新執行緒所執行的執行緒函式地址,多個執行緒可以使用同一個函式地址。
第四個引數是傳給執行緒函式的引數。
第五個引數指定額外的標誌來控制執行緒的建立,為0表示執行緒建立之後立即就可以進行排程,如果為CREATE_SUSPENDED則表示執行緒建立後暫停執行,這樣它就無法排程,直到呼叫ResumeThread()。
第六個引數將返回執行緒的ID號,傳入NULL表示不需要返回該執行緒ID號。
函式返回值:成功返回新執行緒的控制代碼,失敗返回NULL。

第二種:_beginthreadex

unsigned long _beginthreadex( 
void *security,    
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),   
void *arglist,
unsigned initflag,   
unsigned *thrdaddr  
);

第1個引數:安全屬性,NULL為預設安全屬性
第2個引數:指定執行緒堆疊的大小。如果為0,則執行緒堆疊大小和建立它的執行緒的相同。一般用0
第3個引數:指定執行緒函式的地址,也就是執行緒呼叫執行的函式地址(用函式名稱即可,函式名稱就表示地址)
第4個引數:傳遞給執行緒的引數的指標,可以通過傳入物件的指標,線上程函式中再轉化為對應類的指標
第5個引數:執行緒初始狀態,0:立即執行;CREATE_SUSPEND:suspended(懸掛)
第6個引數:用於記錄執行緒ID的地址

程式碼例項:
CreateThread執行緒回撥函式

void ThreadFunc(LPVOID pParam)
{
	printf("執行緒ID號為%4d的子執行緒說:Hello World\n", GetCurrentThreadId());
	return 0;
}

_beginthreadex 執行緒回撥函式

unsigned int __stdcall ThreadFun(PVOID pM)
{
	printf("執行緒ID號為%4d的子執行緒說:Hello World\n", GetCurrentThreadId());
	return 0;
}

_beginthreadex 的回撥函式還可以用函式指標的形式給出

typedef unsigned(__stdcall *PTHREAD_START) (void *);  //定義函式指標

回撥函式

DWORD WINAPI CommProc(LPVOID lpParam)
{
	printf("執行緒ID號為%4d的子執行緒說:Hello World\n", GetCurrentThreadId());
	return 0;
}

主函式

int main()
{

	::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc1, NULL, 0, NULL);
	_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
	//_beginthreadex如果用回撥函式使用下面這條語句
	_beginthreadex(NULL, 0, (PTHREAD_START)CommProc, NULL, 0, NULL);
	return 0;
}

注:如果要使用執行緒,推薦使用_beginthreadex, 安全