线程同步的三种方法(互斥,事件,临界区) 之三 使用事件对象

来源:互联网 发布:大学解题软件 编辑:程序博客网 时间:2024/04/29 12:31
#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,FALSE,LPCWSTR("tickets"));
    
if (g_hEvent)
    {
        
if (ERROR_ALREADY_EXISTS==GetLastError())
        {
            cout
<<"only one instance can run!"<<endl;
            return;
        }
    }
    
//**************************************************
    SetEvent(g_hEvent);
    
//创建线程
    hThread1
=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2
=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

    Sleep(
40000);
    
//关闭事件对象句柄
    CloseHandle(g_hEvent);
}

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

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
    
while (TRUE)
    {
        WaitForSingleObject(g_hEvent,INFINITE);
        
//ResetEvent(g_hEvent);
        
if (tickets>0)
        {
            cout
<<"Thread2 sell ticket :"<<tickets--<<endl;
            SetEvent(g_hEvent);
        }
        
else
        {
            SetEvent(g_hEvent);
            break;
        }
    }
    return 
0;
}
 
原创粉丝点击