用事件同步多线程

 
  1. #include<windows.h>
  2. #include<iostream>
  3. DWORD WINAPI fun1Proc(LPVOID lpParameter );
  4. DWORD WINAPI fun2Proc(LPVOID lpParameter );
  5. int tickets = 100;
  6. HANDLE hEvent;
  7. int main()
  8. {
  9.     HANDLE hThread1;
  10.     HANDLE hThread2;
  11.     /*
  12.     创建一个事件对象(事件对象是内核对象)
  13.     参数一为NULL则指定返回的句柄不能被继承
  14.     参数二指定该事件是人工重置还是自动重置
  15.           当为人工重置时需要调用ResetEvent()使事件无信号,当调用SetReset()使之有信号时,
  16.           所有的等待线程将本释放;
  17.           当我自动重置时,WaitForSingleObject()后系统自动将其设置为无信号,需要用SetReset()将
  18.           其设置为有信号,这时一个线程被释放
  19.     参数三指定事件的初始状态,为true时初始为有信号状态
  20.     参数四指定事件名
  21.     */
  22.     
  23.     hEvent   = CreateEvent(NULL,false,true,NULL);
  24.     hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
  25.     hThread1 =CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
  26.     
  27.     CloseHandle(hThread1);
  28.     CloseHandle(hThread2);
  29.     ReleaseMutex(hEvent);
  30.     Sleep(4000);
  31.     return 0;
  32. }
  33. DWORD WINAPI fun1Proc(LPVOID lpParameter )
  34. {
  35.     while(true)
  36.     {
  37.         WaitForSingleObject(hEvent,INFINITE);
  38.         //ResetEvent(hEvent);
  39.         if(tickets>0)
  40.         {
  41.             std::cout<<"thread1 sell ticket "<<tickets--<<std::endl;
  42.         }
  43.         else
  44.         {
  45.             break;
  46.         }
  47.         SetEvent(hEvent);
  48.     }
  49.     return 0;
  50. }
  51. DWORD WINAPI fun2Proc(LPVOID lpParameter )
  52. {
  53.     while(true)
  54.     {
  55.         WaitForSingleObject(hEvent,INFINITE);
  56.         //ResetEvent(hEvent);
  57.         if(tickets>0)
  58.         {
  59.             std::cout<<"thread2 sell ticket "<<tickets--<<std::endl;
  60.         }
  61.         else
  62.         {
  63.             break;
  64.         }
  65.         SetEvent(hEvent);
  66.     }
  67.     return 0;
  68. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值