多线程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成套使用,回收资源。



 

posted @ 2020-03-31 18:08  坦坦荡荡  阅读(614)  评论(0)    收藏  举报