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, 安全