标签:
这章介绍另外:事件对象和关键代码段。
进程相关函数:
CreateEvent函数:
第一个参数:安全属性,默认的安全属性为NULL
第二个参数:复位方式, 人工设置为TRUE,自动设置为FALSE,
当为人工设置时,等待事件的线程时,需要resetevent函数来设置其为无型号状态。
第三个参数:初始状态:TRUE为有信号状态,FALSE为无信号状态。
第四个参数:对象名称,NULL为匿名名称。
创建或打开一个命名或匿名的事件对象(也属于内核对象)
返回:返回的是事件对象的句柄。
SetEvent函数:
将指定的事件对象设置为有信号状态
ResetEvent函数:
将指定的信号设置为无信号状态。
1. 事件对象:
事件对象也属于内核对象,
包含
(1)使用计数
(2)是自动重置对象还是人工重置对象的bool值
(3)对象处于通知还是还是未通知的bool值。
下面是一个用事件对象来实现线程同步的例子:
下面的在主线程main函数中,调用createevent函数创建人工重置事件内核对象,第二个参数为TRUE,第3各参数为FALSE
所以初始时为无信号状态,这样其他的线程调用waitforsingleobject时也得不到该事件对象。所以需要调用setevent函数
将事件置为有信号状态。
在子线程中,调用waitforsingleobject函数可以得到这个事件对象,但同时其他的线程也能,所以需要resetevent函数将事件对象
设置为无信号状态,在执行动作完后再调用setevent函数将其事件对象置为有信号状态。
1 #include<Windows.h> 2 #include<iostream> 3 using namespace std; 4 5 int tickets=100; 6 HANDLE g_hevents; 7 8 DWORD WINAPI fun1(LPVOID lpParmeters) 9 { 10 while (TRUE) 11 { 12 WaitForSingleObject(g_hevents,INFINITE);//请求对象事件 13 ResetEvent(g_hevents);//将事件对象设置为无信号状态 14 if(tickets>0) 15 { 16 Sleep(1); 17 cout<<"thread1 sell tickets:"<<tickets--<<endl; 18 SetEvent(g_hevents);//将事件对象设置为有信号状态。 19 } 20 else 21 { 22 SetEvent(g_hevents);//将事件对象设置为有信号状态。 23 break; 24 } 25 } 26 return 0; 27 } 28 DWORD WINAPI fun2(LPVOID lpParmeters) 29 { 30 while(TRUE) 31 { 32 WaitForSingleObject(g_hevents,INFINITE);//请求对象事件 33 ResetEvent(g_hevents);//将事件对象设置为无信号状态 34 if(tickets>0) 35 { 36 Sleep(1); 37 cout<<"thread2 sell tickets:"<<tickets--<<endl; 38 SetEvent(g_hevents);//将事件对象设置为有信号状态 39 } 40 else 41 { 42 break; 43 SetEvent(g_hevents);//将事件对象设置为有信号状态 44 } 45 } 46 return 0; 47 } 48 49 50 int main() 51 { 52 HANDLE thread1; 53 HANDLE thread2; 54 55 //线程安全属性为NULL默认,人工设置信号状态TRUE,设置为无信号状态FALSE, 56 //事件名称NULL匿名。 57 g_hevents=CreateEventA(NULL,TRUE,FALSE,NULL); 58 SetEvent(g_hevents);//将事件对象设置为有信号状态 59 60 thread1=CreateThread(NULL,0,fun1,NULL,0,NULL); 61 thread2=CreateThread(NULL,0,fun2,NULL,0,NULL); 62 CloseHandle(thread1); 63 CloseHandle(thread2); 64 65 Sleep(4000); 66 CloseHandle(g_hevents); 67 system("pause"); 68 69 }
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4743228.html