首页 > 代码库 > 线程同步——内核对象实现线程同步——事件内核对象

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

  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 }