以下是一个使用CreateEvent函数在两个线程间进行同步的示例:
#include <iostream>
#include <Windows.h>
// 全局事件句柄
HANDLE gEvent;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// 等待事件被触发
DWORD result = WaitForSingleObject(gEvent, INFINITE);
if (result == WAIT_OBJECT_0)
{
std::cout << "Thread: Event is triggered!" << std::endl;
// 进行其他操作...
// 重置事件为非触发状态,以便下次等待
ResetEvent(gEvent);
}
return 0;
}
int main()
{
// 创建事件对象
gEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (gEvent == NULL)
{
std::cout << "Failed to create event!" << std::endl;
return -1;
}
// 创建线程
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
if (hThread == NULL)
{
std::cout << "Failed to create thread!" << std::endl;
CloseHandle(gEvent); // 关闭事件句柄
return -1;
}
Sleep(2000); // 延迟一段时间
std::cout << "Main: Triggering event..." << std::endl;
// 设置事件为触发状态
SetEvent(gEvent);
// 等待子线程结束并关闭句柄
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
// 关闭主线程中的事件句柄
CloseHandle(gEvent);
return 0;
}
在上述示例中,主线程创建了一个事件对象并将其设置为非触发状态。然后,主线程延迟一段时间后触发该事件,并等待子线程结束。
子线程在启动后等待事件被触发,当事件被触发时,输出相关信息,并进行其他操作。完成后,重置事件为非触发状态以便下次等待。
注意,在使用完毕后需要通过调用CloseHandle函数来关闭并释放事件对象的句柄和线程句柄。
内容由零声教学AI助手提供,问题来源于学员提问