线程同步——内核对象实现线程同步——事件内核对象

  1 事件内核对象
  2 
  3 事件类型对象有两种不同类型,手动重置和自动重置
  4 手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度。
  5 自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度
  6 
  7 下面是一个创建事件内核对象的函数:
  8 HANDLE CreateEvent(
  9 LPSECURITY_ATTRIBUTES lpEventAttributes, 
 10 BOOL   bManualReset, 
 11 BOOL   bInitialState,
 12 PCTSTR lpName );
 13 
 14 第一、四个参数和创建其它内核对象相似想必已经十分熟悉了。
 15 这里就不介了哈。
 16 第二个参数bManualReset是一个BOOL值,告诉系统是手动重置对象(TRUE),还是自动重置对象(FALSE).
 17 第三个参数bInitialState是将事件初始化为触发状态(TRUE),还是未触发状态(FALSE)
 18 
 19 BOOL SetEvent(  HANDLE hEvent ) ;
 20 该函数把事件变为触发状态
 21 
 22 BOOL ResetEvent( HANDLE hEvent ) ;
 23 该函数把事件变为未触发状态
 24 
 25 
 26 使用方法:
 27 1 28 //定义一个事件对象1
 29 HANDLE g_hEvent ; 
 30 
 31 2 32 //创建一个手动重置的事件对象,并把事件出事话为触发状态
 33 g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
 34 
 35 3 36 //在线程中调用
 37 DWORD WINAPI ThreadFunOne(PVOID pvParam) 
 38 {
 39 WaitForSingleObject(g_hEvent,INFINITE);
 40 g_x++;
 41 
 42 return 0;
 43 }
 44 
 45 #include "windows.h"
 46 #include "iostream"
 47 using namespace std;
 48 long g_x = 0 ;
 49 
 50 //定义一个事件对象1
 51 HANDLE g_hEvent ;  
 52 
 53 //定义线程函数1
 54 DWORD WINAPI ThreadFunOne(PVOID pvParam) ;
 55 
 56 //定义线程函数2
 57 DWORD WINAPI ThreadFunTwo(PVOID pvParam);
 58 
 59 int main()
 60 {
 61 
 62     //创建一个手动重置的事件对象,并把事件出事话为触发状态
 63     g_hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
 64 
 65     //把事件设为未触发状态
 66     //    ResetEvent(g_hEvent);
 67 
 68     //把事件设为触发状态
 69     //    SetEvent(g_hEvent) ;
 70 
 71     //创建线程1
 72     HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
 73     CloseHandle(hThreadOne);
 74 
 75     //创建线程2
 76     HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
 77     CloseHandle(hThreadTwo);
 78 
 79     //让主线程先挂起,确保其它线程执行完成
 80     Sleep(1000); 
 81     cout<<g_x<<endl;
 82     return 0 ;
 83 }
 84 
 85 DWORD WINAPI ThreadFunOne(PVOID pvParam) 
 86 {
 87     WaitForSingleObject(g_hEvent,INFINITE);
 88     g_x++;
 89 
 90     return 0;
 91 }
 92 
 93 DWORD WINAPI ThreadFunTwo(PVOID pvParam)
 94 {
 95     Sleep(200);
 96     WaitForSingleObject(g_hEvent,INFINITE);
 97     g_x++;    
 98 
 99     return 0;
100 }

 

线程同步——内核对象实现线程同步——事件内核对象,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。