使用事件对象实现线程同步

//事件对象也属于内核对象,包含一个使用计数,
//一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,
//另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。
//有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。
//当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。
//当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。

#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(
    LPVOID lpParameter
    );

DWORD WINAPI Fun2Proc(
    LPVOID lpParameter
    );

int tickets = 100;
HANDLE g_hEvent;

void main()
{
    HANDLE hThread1;
    HANDLE hThread2;
    g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);  //设置为自动重置
    //SetEvent(g_hEvent);
    hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);    
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    
    Sleep(4000);
}

DWORD WINAPI Fun1Proc(
    LPVOID lpParameter
    )
{
    while(TRUE)
    {
        WaitForSingleObject(g_hEvent,INFINITE);
        if(tickets>0)
        {
            Sleep(1);
            cout<<"Thread1 sell ticket : "<<tickets--<<endl;
        }
        else
            break;
        SetEvent(g_hEvent);
    }
    return 0;
}

DWORD WINAPI Fun2Proc(
    LPVOID lpParameter
    )
{
    while(TRUE)
    {
        WaitForSingleObject(g_hEvent,INFINITE);
        if(tickets>0)
        {
            Sleep(1);
            cout<<"Thread2 sell ticket : "<<tickets--<<endl;
        }
        else
            break;
        SetEvent(g_hEvent);
    }
    return 0;
}
posted @ 2012-10-08 15:55  恒月美剑  阅读(329)  评论(0编辑  收藏  举报