CreateEvent
是一个 Windows API 函数,用于创建或打开一个事件对象,事件对象可以用来在线程之间同步操作。该函数的签名如下:
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性,可以为 NULLBOOL bManualReset, // 是否为手动重置事件BOOL bInitialState, // 事件的初始状态(TRUE 为有信号,FALSE 为无信号)LPCWSTR lpName // 事件对象的名称,可以为 NULL
);
参数解释:
-
lpEventAttributes
(安全属性)- 指向
SECURITY_ATTRIBUTES
结构的指针,定义事件对象的安全性(如是否可继承)。如果为NULL
,则事件对象将使用默认的安全性设置,并且句柄不可继承。
- 指向
-
bManualReset
(手动重置)- 指定事件对象的重置方式。
- 如果为
TRUE
,事件对象为手动重置,必须通过调用ResetEvent
函数手动将事件的状态重置为无信号状态。 - 如果为
FALSE
,事件对象为自动重置,当一个等待线程被释放时,系统自动将事件的状态重置为无信号。
- 如果为
- 指定事件对象的重置方式。
-
bInitialState
(初始状态)- 指定事件对象的初始状态。
- 如果为
TRUE
,事件对象的初始状态为有信号状态。 - 如果为
FALSE
,事件对象的初始状态为无信号状态。
- 如果为
- 指定事件对象的初始状态。
-
lpName
(事件名称)- 指向以
null
结尾的字符串,表示事件对象的名称。如果不需要为事件命名,则可以为NULL
。命名事件对象允许不同进程中的线程通过名字来访问同一个事件对象。
- 指向以
返回值:
- 成功时,返回事件对象的句柄,失败时返回
NULL
。可以通过调用GetLastError
获取错误信息。
例子
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
解释:
NULL
: 不需要特殊的安全属性,使用默认设置。FALSE
(自动重置): 事件是自动重置的,这意味着一旦一个等待的线程被唤醒,事件将自动重置为无信号状态,不需要手动调用ResetEvent
。FALSE
(初始状态无信号): 事件对象在创建时的状态为无信号状态,意味着线程调用WaitForSingleObject
时将会阻塞,直到有线程调用SetEvent
来将事件状态设置为有信号。NULL
: 事件不需要名字,仅在当前进程中使用。
使用场景:
- 同步线程:比如等待某一线程完成初始化后再继续执行另一个线程的操作。
- 通知机制:多个线程可以等待同一个事件对象,当事件进入有信号状态时,它们可以根据设计进行不同的操作。
示例:
#include <windows.h>
#include <iostream>int main()
{// 创建一个自动重置的、初始状态为无信号的事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);if (hEvent == NULL){std::cerr << "事件创建失败: " << GetLastError() << std::endl;return 1;}// 模拟设置事件为有信号状态std::cout << "设置事件为有信号状态..." << std::endl;SetEvent(hEvent);// 等待事件进入有信号状态WaitForSingleObject(hEvent, INFINITE);std::cout << "事件已被触发,继续执行..." << std::endl;// 关闭事件句柄CloseHandle(hEvent);return 0;
}
在这个例子中,主线程创建了一个自动重置事件,并且将它设置为有信号状态后,再等待该事件的触发。
#include <windows.h>
#include <iostream>int main()
{// 创建一个自动重置的、初始状态为无信号的事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);if (hEvent == NULL){std::cerr << "事件创建失败: " << GetLastError() << std::endl;return 1;}// 模拟设置事件为有信号状态std::cout << "设置事件为有信号状态..." << std::endl;SetEvent(hEvent);// 等待事件进入有信号状态WaitForSingleObject(hEvent, INFINITE); //自动重置会将hEvent置为无信号状态std::cout << "事件已被触发,继续执行..." << std::endl;//std::cout << "设置事件为有信号状态2..." << std::endl;//SetEvent(hEvent);WaitForSingleObject(hEvent, INFINITE);std::cout << "事件已被触发,继续执行2..." << std::endl;// 关闭事件句柄CloseHandle(hEvent);return 0;
}