概念
事件对象也属于内核对象
我们看下它的参数
HANDLE CreateEventW(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCWSTR lpName
);
第一个参数表示安全属性,一般设置为null
第二个表示复位方式 ,TRUE 必须用 ResetEvent 手动复原 ,FALSE,自动还原为无信号状态
第三个表示 初始状态,TRUE 初始状态为有信号状态,FALSE无信号状态
第四个对象名称,一般设置为NULL,表示 无名的事件对象
用法
通过 SetEvent 设置为有信号状态, ResetEvent 设置为无信号状态,通过waitforsignleobject等待
代码
int main()
{
HANDLE hThreadA, hThreadB;
hThreadA = CreateThread ( NULL , 0 ,SellTicketA, NULL , 0, 0);
hThreadB = CreateThread ( NULL , 0, SellTicketB, NULL , 0, 0);
CloseHandle (hThreadA);
CloseHandle (hThreadB);
g_hEvent = CreateEvent ( NULL , FALSE , FALSE , NULL );
SetEvent (g_hEvent);
Sleep (4000);
CloseHandle (g_hEvent);
system ("pause");
return 0;
}
这里首先创建了两个线程,A代表A售票厅,B代表B售票厅,然后创建事件,一开始第三个参数设置为无信号,调用 SetEvent 把对象设置为有信号状态,然后随机执行主线程和子线程
线程B的代码
DWORD WINAPI SellTicketB(void* lpParam)
{
while (1)
{
WaitForSingleObject (g_hEvent, INFINITE );
if (iTickets > 0)
{
Sleep (1);
iTickets--;
printf ("B remain %d\n", iTickets);
}
else
{
break;
}
SetEvent (g_hEvent);
}
return 0;
}
线程A的代码和线程B的代码差不多,没什么区别,关于这行代码的解释,请移步我的问题,我的问题有更清晰的回答