使用事件同步,主要是一个事件句柄和五个函数:
HANDLE g_hEvent = NULL;
g_hEvent = CreateEvent(NULL, FALSE, TRUE, L"Test Event");
WaitForSingleObject(g_hEvent, INFINITE);
SetEvent(g_hEvent);
ResetEvent(g_hEvent);
CloseHandle(g_hEvent);
示例:
// Event.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "process.h"
#include "windows.h"
#include "stdio.h"
HANDLE g_hEvent = NULL;
unsigned __stdcall thread1(void *lparam);
int main()
{
/*
参数2:指定将事件对象创建成手动复原还是自动复原。
如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。
如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。
参数3:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
参数4:跨进程会使用到该名字参数
*/
g_hEvent = CreateEvent(NULL, FALSE, TRUE, L"Test Event");
UINT iThreadId = 0;
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
getchar();
if (g_hEvent)
{
CloseHandle(g_hEvent);
}
return 0;
}
void useEvent() {
WaitForSingleObject(g_hEvent, INFINITE);
printf("正在调用Event");
/*
* SetEvent函数将状态设置为有信号,ResetEvent函数将状态设置为无信号。
* 此处如果不调用SetEvent或者在最后调用ResetEvent都会使运行在该线程之后的线程等待。
*/
SetEvent(g_hEvent);
}
unsigned __stdcall thread1(void *lparam)
{
useEvent();
return 0;
}