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

 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 }

 

你可能感兴趣的:(线程同步)