事件
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCSTR lpName
);
bManualReset:TRUE,使用ResetEvent()手动重置为无信号状态;FALSE,当一个等待线程被释放时,自动重置状态为无信号状态。
bInitialState:指定事件对象的初始状态,当TRUE,初始状态为有信号状态;当FALSE,初始状态为无信号状态。
WaitForSingleObject(hEvent,INFINITE);
hEvent 等待事件的句柄
INFINITE 阻塞时长,单位ms,INFINITE为无限等待
WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 0) 获取到信号
DWORD dw = WaitForSingleObject(hProcess, 5000); //等待一个进程结束
switch (dw)
{
case WAIT_OBJECT_0:
// hProcess所代表的进程在5秒内结束
break;
case WAIT_TIMEOUT:
// 等待时间超过5秒
break;
case WAIT_FAILED:
// 函数调用失败,比如传递了一个无效的句柄
break;
}
CloseHandle(hEvent);
等待阻塞函数
WaitForMultipleObjects(g_Number,hThread,TRUE,INFINITE); //1.等台?待鋣数簓量? 最?大洙?值μ为aMAXIMUM_WAIT_OBJECTS(辍?4)? 2.等台?待鋣句?柄括?数簓据Y的?第台?一?个? 3.true等台?待鋣所ù有瓺 false任?意癮一?个?有瓺信?号? 4.等台?待鋣时骸?长¤
WaitForSingleObject(g_hMutex,INFINITE); //同事件阻塞函数
互斥锁
固有特点(优点+缺点):
1、是一个系统核心对象,所以有安全描述指针,用完了要 CloseHandle 关闭句柄,这些是内核对象的共同特征;
2、因为是核心对象,所以执行速度会比 Critical Sections 慢几乎100倍的时间(当然只是相比较而言);
3、因为是核心对象,而且可以命名,所以可以跨进程使用;
4、Mutex 使用正确的情况下不会发生死锁;
5、在“等待”一个 Mutex 的时候,可以指定“结束等待”的时间长度;
6、可以检测到当前拥有互斥器所有权的线程是否已经退出!Wait……函数会返回:WAIT_ABANDONED
锁创建函数原型
HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in_opt LPCTSTR lpName );
lpMutexAttributes : 第一个参数表示安全控制,一般直接传入NULL。
bInitialOwner第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线程ID非零,所以互斥量处于未触发状态,表示互斥量为创建线程拥有。 如果传入FALSE,那么互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这意味互斥量不为任何线程占用,处于触发状态。
lpName第三个参数用来设置互斥量的名称,在多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。
CreateMutex用于创建名为lpName的互斥量内核对象,并返回指向该内核对象的句柄。如果该内核对象已经存在,那么CreateMutex会返回该内核对象的句柄,并通过系统返回错误ERROR_ALREADY_EXISTS,通过GetLastError()获得。
HANDLE WINAPI OpenMutex(
In DWORD dwDesiredAccess,
In BOOL bInheritHandle,
In LPCTSTR lpName
);
dwDesiredAccess:对互斥量对象访问权限的设置,MUTEX_ALL_ACCESS 请求对互斥体的完全访问,MUTEX_MODIFY_STATE 允许使用 ReleaseMutex 函数,SYNCHRONIZE 允许互斥体对象同步使用;
bInheritHandle:是否希望子进程继承互斥量对象的句柄,一般设置为false;
lpName:要打开的互斥量对象的名称;
OpenMutex用于打开已经存在的互斥量对象,若打开成功,则返回指向该内核对象的句柄,否则返回NULL。可以使用CreateMutex来实现打开功能。
HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(g_hMutex,INFINITE); //同事件阻塞函数
ReleaseMutex(g_hMutex); //释放互斥锁
CloseHandle