引用:windows程序員面試指南
windows上常用的創建線程的方法:CreateThread(),_beginthread(),std::thread
1.CreateThread()
CreateThread 是 windows 提供的 api,用法如下:
HANDLE CreateThread([in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,[in] SIZE_T dwStackSize,[in] LPTHREAD_START_ROUTINE lpStartAddress,[in, optional] __drv_aliasesMem LPVOID lpParameter,[in] DWORD dwCreationFlags,[out, optional] LPDWORD lpThreadId
);
注意:默認情況下,每個線程都有 1MB 的堆棧空間
2._beginthread() 和 _beginthread()
uintptr_t _beginthread( // NATIVE CODEvoid( __cdecl *start_address )( void * ),unsigned stack_size,void *arglist
);
uintptr_t _beginthread( // MANAGED CODEvoid( __clrcall *start_address )( void * ),unsigned stack_size,void *arglist
);
uintptr_t _beginthreadex( // NATIVE CODEvoid *security,unsigned stack_size,unsigned ( __stdcall *start_address )( void * ),void *arglist,unsigned initflag,unsigned *thrdaddr
);
uintptr_t _beginthreadex( // MANAGED CODEvoid *security,unsigned stack_size,unsigned ( __clrcall *start_address )( void * ),void *arglist,unsigned initflag,unsigned *thrdaddr
);
注意:若要使用 _beginthread 或 _beginthreadex,應用程序必須與一個多線程 C 運行庫鏈接。
CreateThread()和_beginthread()的區別
1.庫的不同:CreateThread是Windows API的一部分,而_beginthread是C運行庫(CRT)中的函數。這意味著_beginthread可以在C或C++程序中通過包含相應的頭文件來使用,而CreateThread則需要通過包含processthreadsapi.h頭文件來使用。
2.線程對象的處理:使用CreateThread創建的線程在終止后,線程對象仍然存在于系統中,需要顯式地通過調用CloseHandle來關閉該線程對象。而使用_beginthread創建的線程,在調用_endthread后會自動銷毀線程對象,無需手動關閉。
3.對CRT庫的兼容性:如果在線程中使用CRT庫,應該使用_beginthread而不是CreateThread。這是因為CreateThread不會判斷傳遞給它的起始地址lpStartAddr是數據還是代碼,也不會判斷是否有足夠的訪問權限。這可能導致類成員函數或非函數指針的強制轉換,以及棧溢出和訪問權限問題。此外,如果在線程中使用類成員函數,需要注意this指針的正確傳遞。而在類對象外調用時,this指針可能是未知的。
4.內存泄漏:在使用CRT函數時,如果在CreateThread創建的線程中使用CRT函數,可能會導致內存泄漏。而在_beginthread創建的線程中使用CRT函數通常不會產生內存泄漏問題。
3.std::thread
C++11,添加 std::thread
常用方法:
get_id 獲取線程 ID。
joinable 檢查線程是否可被 join。
join Join 線程。
detach Detach 線程
swap Swap 線程 。
native_handle 返回 native handle。
hardware_concurrency [static] 檢測硬件并發特性
————————————————
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/qq_34213260/article/details/106445995