事件是线程、进程通信上的一个重要的点。
一个事件有两种状态,分别是signaled和nonsignaled。nonsignaled阻断线程,signaled开启。
它可以阻断多个线程,也可以开启多个线程:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位方式
BOOL bInitialState, // 初始状态, 如果为TRUE,初始状态为有信号状态;否则为无信号状态。
LPCSTR lpName // 对象名称
);
手动Reset的事件:bManualReset 为true
必须通过ResetEvent显示将其从将从signaled状态变为nonsignaled。当事件状态为signaled,所有等待此对象的线程逐个被唤醒。
自动reset的事件:bManualReset 为false
只要有一个线程释放事件,系统自动将状态改为nonsignaled。如果有多个线程在等待,那么只会唤醒其中一个线程。
// 设置signaled状态
BOOL SetEvent(
HANDLE hEvent
);
// 设置nonsignaled状态
BOOL ResetEvent(
HANDLE hEvent
);
// 一般用于跨进程获取已经创建的事件对象
HANDLE OpenEventA(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCSTR lpName
);
Demo:
svn://gitee.com/sudaidai/Knowledge_List_of_C
文件夹路径:WindowsAPI/Event