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