您的位置:首页 > 其它

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

2007-12-12 10:19 483 查看

#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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐