多线程API总结
CreateThread创建线程,成功返回线程句柄,失败返回NULL
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //指向SECURITY_ATTRIBUTESX形态的结构指针。NULL为使用默认安全性
DWORD dwStackSize, //设置初始栈大小,以字节为单位,如果为0,那么默认使用与调用该函数的线程相同的栈空间大小
LPTHREAD_START_ROUTINE lpStartAddress,//指向线程函数的指针,函数名没有限制 形式:DWORD WINAPI ThreadProc(LPVOID lpParam)
LPVOID lpParameter, //向线程函数传递的参数,是一个void*指针,不需要传递参数时为NULL
DWORD dwCreationFlags,//线程标志
LPDWORD lpThreadId //保存新线程ID,若不想返回线程ID,设为NULL(这是返回值)
CreateThread在主线程基础上创建一个新线程。
获取线程ID
DWORD WINAPI GetCurrentThreadId(VOID);//返回获取当前的线程ID
关闭线程句柄
BOOL CloseHandle(HANDLE hObject);
//关闭一个线程句柄,引用计数减1,表示我不对这个句柄对应的线程做任何干预,
//但并没有结束线程
挂起指定线程:SuspendThread
DWORD WINAPI SuspendThread(HANDLE hThread);
恢复被挂起的线程:ResumeThread
DWORD WINAPI ResumeThread(HANDLE hThread);
休眠线程:Sleep
VOID WINAPI Sleep(DWORD dwMilliseconds);//dwMilliseconds表示毫秒数
WaitForSingleObject等待一个内核对象变为已通知状态
DWORD WaitForSingleObiect(HANDLE hObject,DWORD dwMilliseconds);
hObject:指明一个内核对象的句柄
dwMilliseconds:等待时间,毫秒数

通俗的讲线程函数没结束就处于未通知状态,已结束就处于已通知状态。
线程终止:
最佳方法时让他的线程函数Return返回。
除此之外:
ExitThread(); 避免使用
TerminateThread(); 必须避免
VOID ExitThread(DWORD dwExitCode); (线程内终止线程)
这个方法退出线程不会执行函数的return语句,也就不会调用线程函数作用域内申请的类对象的析构函数,会造成内存泄漏。
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);(线程外终止线程)
hThread:被终止线程句柄
dwExitCode:退出码
TerminateThread能够撤销任何线程,hThread参数用于标识被终止运行的线程句柄,dwExitCode是线程终止的退出码。
同时,线程的内核对象的使用计数被递减。TerminateThread函数是异步运行的函数,当函数返回时,并不能保证线程被撤销。
如果需要确切的知道该线程已被终止,使用WaitForSingleObiect
GetExitCodeThread获取线程结束码。
BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode);
hThread:由CreateThread()传回的线程handle
lpExitCode:指向一个FWORD,用于接收结束代码
线程若未结束,lpExitCode的值为STILL_ACTIVE
WaitForMultipleObjects等待多个内核对象变为已通知状态
DWORD WaitForMultipleObjects(
DWORD dwCount,//等待的内核对象个数
CONST HANDLE* phObjects,//存放被等待的内核对象句柄的数组
BOOL bWaitAll,//是否等到所有的内核对象为已通知状态后才返回
DWORD dwMilliseconds //等待时间
);
![]()

CreateThread API创建线程使用sprintf,malloc strcat等涉及CRT存储堆操作的CRT库函数很危险,容易造成线程意外终止,使用
_beginthread和_beginthreadex创建的线程终可以安全的使用CRT函数,但是必须在线程结束时相应的调用_endthread或_endthreadex
头文件#include<process.h>
![]()
uintptr_t _beginthread(
void( *start_address )( void * ), //线程函数入口地址,对于_beginthread,线程函数调用约定是_cdecl
unsigned stack_size, //堆栈大小,设置为0为系统默认值
void *arglist //传递给线程的参数列表,无参时为NULL
);
函数调用成功返回新创建的线程的句柄,需reinterpret_cast<HANDLE>强制转换,但如果新创建的线程退出太快,可能无法返回一个有效句柄。
失败返回-1
与_endthread成套使用,回收资源。


浙公网安备 33010602011771号