C++多线程同步(采用事件对象Event)

来源:互联网 发布:一路一带破产知乎 编辑:程序博客网 时间:2024/05/02 02:03

C++多线程同步(采用事件对象Event

#include <Windows.h>#include <iostream>using namespace std;DWORD  WINAPI  Fun1Proc(LPVOID lpParameter);//线程1的入口函数DWORD  WINAPI  Fun2Proc(LPVOID lpParameter);//线程2的入口函数int g_tickets = 100;//总票数HANDLE g_hEvent;//全局事件对象void main(){HANDLE hThread1;HANDLE hThread2;//创建自动重置事件内核对象g_hEvent = CreateEvent(NULL,FALSE, FALSE, "tickets");//保证应用程序只有一个实例if (g_hEvent){if (ERROR_ALREADY_EXISTS == GetLastError()){cout<<"只有一个实例可以运行!"<<endl;return;}}SetEvent(g_hEvent);//设置事件对象为有信号//创建线程hThread1 = CreateThread(NULL, 0 , Fun1Proc, NULL, 0, NULL);hThread2 = CreateThread(NULL, 0 , Fun2Proc, NULL, 0, NULL);CloseHandle(hThread1);//并没有终止线程的运行;当不再需要线程句柄时,应将其关闭,让这个线程内核对象的引用计数减1CloseHandle(hThread2);//让主线程睡眠4秒Sleep(4000);//关闭事件对象句柄CloseHandle(g_hEvent);}DWORD  WINAPI  Fun1Proc(LPVOID lpParameter){while (TRUE){//请求事件对象WaitForSingleObject(g_hEvent,INFINITE);if (g_tickets>0){Sleep(1);cout<<"Thread1 sell ticket :"<<g_tickets--<<endl;SetEvent(g_hEvent);}else{SetEvent(g_hEvent);break;}}return 0;}DWORD  WINAPI  Fun2Proc(LPVOID lpParameter){while (TRUE){//请求事件对象WaitForSingleObject(g_hEvent,INFINITE);if (g_tickets>0){Sleep(1);cout<<"Thread2 sell ticket :"<<g_tickets--<<endl;SetEvent(g_hEvent);}else{SetEvent(g_hEvent);break;}}return 0;}


0 0