//创建线程
//返回值:线程句柄
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
//挂起线程:
DWORD WINAPI SuspendThread(
_In_ HANDLE hThread // 线程句柄
);
//恢复线程执行
DWORD WINAPI ResumeThread(
_In_ HANDLE hThread // 线程句柄
);
//内核对象: 如线程,当线程处于运行时,是未通知状态,当线程处于停止状态时,是已通知状态
//满足两个参数任何一个都可以继续往下执行 timeOut:-1 永远等待
//等待线程执行完成 返回值 : WAIT_OBJECT_0(0) :线程已通知 WAIT_TIMEOUT(0x102) :线程超时
DWORD WINAPI WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
DWORD WINAPI WaitForMulipleObjects(_In_ DWORD nCount,//对象个数
_In_ const HANDLE *lpHandles,//存放多个内核对象的句柄的数组 的指针;
_In_ BOOL bWaitAll,//TRUE 为等待全部对象为已通知,FLASE 为只要有一个变为已通知
_In_ DWORD dwMilliseconds//等待时间
);
//退出线程
DWORD WINAPI ExitThread(DWORD exitCode); //线程内部使用
//return a //正常返回 a为退出码
DWORD WINAPI TerminateThread(_In_ HANDLE hThread, _In_ DWORD exitCode);//线程外部使用,直接终止线程,并保留线程堆栈不销毁
//获取线程退出码
BOOL GetExitCodeThread(_In_ HANDLE hThread, _Out_ DWORD exitCode)//配合WaitForSingleObject 使用/
// 获取挂起线程内部信息
DWORD WINAPI SuspendThread(_In_ HANDLE hhandle);
CONTEXT context;//设置要获取的类型
context.ContextFlage = CONTEXT_CONTROL;//有多种
//获取
BOOL GetThreadContext(_In_ HANDLE hThread, _In_ CONTEXT* context);
//设置
CONTEXTSetThreadContext(_In_ HANDLE hThread, _In_ CONTEXT* context);
//临界区
//创建
CRITICAL_SECTION cs;
//初始化
VOID WINAPI InitializeCriticalSection(&cs);
//在线程中使用
//获取
VOID WINAPI EnterCriticalScetion(&cs);
//释放
VOID WINAPI LeaveCriticalSection(&cs);
//删除
VOID WINAPI DeleteCriticalSection(cs);
//使用时可以为每一个全局变量单独创建一个锁,避免多个线程使用不同的有交叉的多个全局变量时造成死锁
DWORD a; DWORD b; DWORD c;
CRITICAL_SECTION ka; CRITICAL_SECTION kb; CRITICAL_SECTION kc;
//互斥体:可以跨进程进行线程控制 互斥体是内核对象
//创建 在同一个进程内使用可以不提供Nmae
HANDLE gMutex = CreateMutex(nullptr, FALSE, "name");
//使用
HANDLE gMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "name");
WaitForSingleObject(HANDLE g_Mutex, DWORD timeOut);//在互斥体没有被释放之前,只能等待,不能接着往下
//释放
ReleaseMutex(HANDLE dMutex);