事件(Event)

来源:互联网 发布:电脑服装设计软件 编辑:程序博客网 时间:2024/06/15 22:27

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, 
BOOL bInitialState,
LPCSTR lpName
);
bManualReset:TRUE,使用ResetEvent()手动重置为无信号状态;FALSE,当一个等待线程被释放时,自动重置状态为无信号状态。

bInitialState:指定事件对象的初始状态,当TRUE,初始状态为有信号状态;当FALSE,初始状态为无信号状态。

#include "stdafx.h"
#include<windows.h>
#include<iostream>
#include<process.h>


int g_tickets = 100;
HANDLE g_hEvent;
void Fun1Proc()
{
    while (true)
    {
        WaitForSingleObject(g_hEvent,INFINITE);
        if (g_tickets > 0)
        {
            std::cout << "thread1 sell ticket:" << g_tickets-- << std::endl;
            SetEvent(g_hEvent);//一旦一个线程结束了自己对全局资源的使用,他通过调用SetEvent通知别人可以使用了
        }
        else
        {
            SetEvent(g_hEvent);
            break;
        }
    }
}
void Fun2Proc()
{
    while (true)
    {
        WaitForSingleObject(g_hEvent, INFINITE);
        if (g_tickets > 0)
        {
            std::cout << "thread2 sell ticket:" << g_tickets-- << std::endl;
            SetEvent(g_hEvent);
        }
        else
        {
            SetEvent(g_hEvent);
            break;
        }
    }
}
void main()
{
    HANDLE hThread[2];
    g_hEvent = CreateEvent(NULL,false,false,NULL);
    SetEvent(g_hEvent);
    hThread[0] = (HANDLE)_beginthreadex(NULL,0,((unsigned int(_stdcall*)(void*))&Fun1Proc),NULL,0,NULL);
    hThread[1] = (HANDLE)_beginthreadex(NULL, 0, ((unsigned int(_stdcall*)(void*))&Fun2Proc), NULL, 0, NULL);


    WaitForMultipleObjects(2,hThread,true,INFINITE);
}

原创粉丝点击