DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
功能说明:
等待函数可使线程自愿进入等待,直到一个特定的内核对象变为已通知状态为止。
hHandle 内核对象句柄
dwMilliseconds 等待事件,单位是毫秒,INFINITE(-1)一直等待,直到内核对象变为已通知
返回值:
WAIT_OBJECT_0(0) 等待对象变为已通知
WAIT_TIMEOUT(0x102) 超时
当线程正在运行的时候,线程内核对象处于未通知状态
当线程终止运行的时候,它就变为已通知状态
在内核中就是个BOOL值,运行时FALSE,结束TRUE
DWORD WaitForMultipleObjects(
DWORD nCount, //几个对象
CONST HANDLE * lpHandle, //对象数组的地址
BOOL bWaitAll, //等待类型,TRUE,等所有变为通知; FALSE,等待一个变为通知
DWORD dwMilliseconds
);
eg:
HANDLE hHandleArr[2];
hHandleArr[0] = ::CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
hHandleArr[1] = ::CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
::WaitForMultipleObjects(2, hHandleArr,TRUE,2000);//2S
CloseHandle(hHandleArr[0]);
CloseHandle(hHandleArr[1]);
互斥体,可以跨进程进行互斥控制
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCSTR lpName //互斥体名字
);
OpenMutex()
WaitForSingleObject ()
ReleaseMutex()
互斥体与临界区的区别
- 临界区只能用于单个进程间的线程控制
- 互斥体可以设定等待超时,但临界区不能
- 线程意外终结时,Mutex可以避免无限等待
- Mutex效率没有临界区高(互斥体是内核对象,所以可以跨进程)
事件
CreateEvent();
SetEvent();设为已通知
ReleaseEvent();设为未通知
信号量
HANDLE CreateSemaphoreA(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //一般为NULL
LONG lInitialCount,//初始资源数量,0时不发送信号
LONG lMaximumCount,//表示最大并发数量。lInitialCount<= lMaximumCount
LPCSTR lpName//信号量的名称,NULL表示匿名信号量
);
OpenSemaphore()
ReleaseSemaphore()递增当前信号量的计数值