码迷,mamicode.com
首页 > 编程语言 > 详细

VC++深入详解——16章:线程同步,事件对象

时间:2015-08-19 22:36:10      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

这章介绍另外:事件对象和关键代码段。

进程相关函数:

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 }

 

VC++深入详解——16章:线程同步,事件对象

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4743228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!