1 語法
uintptr_t _beginthreadex( // NATIVE CODE
void *security,
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
2 參數(shù)
- security:指向security attributes結(jié)構(gòu)的指針贪庙,此結(jié)構(gòu)確定返回的句柄是否由子進(jìn)程繼承。如果security為NULL拷淘,則不能繼承句柄层皱。
- stack_size:新線程的堆棧大小或0伴箩。
- start_address:啟動開始執(zhí)行新線程的例程的地址。對于_beginthread绝葡,調(diào)用約定是__cdecl(針對本機(jī)代碼)或__clrcall(針對托管代碼)深碱;對于_beginthreadex,它是__stdcall(針對本機(jī)代碼)或__clrcall(針對托管代碼)藏畅。
- arglist:要傳遞到新線程的參數(shù)或列表或NULL敷硅。
- initflag:控制新線程的初始狀態(tài)的標(biāo)志。將 initflag設(shè)置為 0以立即運(yùn)行,或設(shè)置為 CREATE_SUSPENDED以在掛起狀態(tài)下創(chuàng)建線程绞蹦;使用 ResumeThread 來執(zhí)行此線程力奋。將 initflag設(shè)置為 STACK_SIZE_PARAM_IS_A_RESERVATION標(biāo)志以將 stack_size用作堆棧的初始保留大小(以字節(jié)計)幽七;如果未指定此標(biāo)志景殷,stack_size將指定提交大小。
- thrdaddr:指向接收線程標(biāo)識符的32位變量锉走。如果此變量為NULL滨彻,則不可用。
3 返回值
如果成功挪蹭,則這些函數(shù)中的每一個都會返回一個句柄到新創(chuàng)建的線程亭饵;但是,如果新創(chuàng)建的線程退出過快梁厉,則_beginthread 可能不會返回有效句柄辜羊。
4 使用實例
unsigned int nThreadID = 0;
m_hGetOneFrameHandle[i] = (void*) _beginthreadex( NULL , 0 , WorkThread , this, 0 , &nThreadID );
if (NULL == m_hGetOneFrameHandle[i])
{
ShowErrorMsg(TEXT("Create thread fail"), 0);
}
// ch:工作線程 | en:Working thread
unsigned int __stdcall WorkThread(void* pUser)
{
if (NULL == pUser)
{
return -1;
}
CMultipleCameraDlg* pCam = (CMultipleCameraDlg*)pUser;
if (NULL == pCam)
{
return -1;
}
int nUsingCameraNum = pCam->m_nUsingCameraNum;
pCam->m_nUsingCameraNum = -1;
pCam->ThreadFun(nUsingCameraNum);
return 0;
}
注意:
- 在 Win32 API 中,創(chuàng)建線程的基本函數(shù)是 CreateThread词顾,而 _beginthread(ex) 是 C++ 運(yùn)行庫的函數(shù)八秃。為什么要有兩個呢?因為C++ 運(yùn)行庫里面有一些函數(shù)使用了全局量肉盹,如果使用 CreateThread 的情況下使用這些C++ 運(yùn)行庫的函數(shù)昔驱,就會出現(xiàn)不安全的問題。而 _beginthreadex 為這些全局變量做了處理上忍,使得每個線程都有一份獨(dú)立的“全局”量骤肛。
- 所以,如果你的編程只調(diào)用 Win32 API/SDK 窍蓝,就放心用 CreateThread腋颠;如果要用到
C++ 運(yùn)行時間庫,那么就要使用 _beginthreadex 吓笙,并且需要在編譯環(huán)境中選擇 Use
MultiThread Lib/DLL淑玫。- 線程handle因為是內(nèi)核對象,所以需要在最后closehandle面睛。
QT多線程
- QThread最終還是調(diào)用_beginthreadex或者CreateThread絮蒿。
參考:
1、https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/beginthread-beginthreadex?view=msvc-160
2侮穿、https://www.cnblogs.com/MCSFX/p/13180726.html