首页 > 代码库 > 线程同步——内核对象实现线程同步——事件内核对象
线程同步——内核对象实现线程同步——事件内核对象
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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。