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

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

进程相关函数:

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 }
时间: 2024-08-05 11:12:10

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

多线程实现线程同步——事件对象

事件对象是指在程序中使用内核对象的有无信号状态实现线程的同步. 1.使用API函数操作事件对象 API函数为CreateEvent: 函数原型为: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name); 参数lpEve

第16章 线程同步与异步套接字

转自: https://blog.csdn.net/u014162133/article/details/46573873 原文地址:https://www.cnblogs.com/happykoukou/p/9379167.html

孙鑫视频VC++深入详解学习笔记

Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesson5: 文本编程 Lesson6: 菜单编程 Lesson7: 对话框编程 Lesson9: 定制应用程序的外观 Lesson10: 绘图控制 Lesson11 图形的保存和重绘 Lesson12 文件操作 Lesson 13: 文档串行化 Lesson14 网络编程 Lesson 15 多线程 Lesson 16 线程同步

redis配置文件详解及实现主从同步切换

redis配置文件详解及实现主从同步切换 redis复制 Redis复制很简单易用,它通过配置允许slave Redis Servers或者Master Servers的复制品.接下来有几个关于redis复制的非常重要特性: 一个Master可以有多个Slaves. Slaves能过接口其他slave的链接,除了可以接受同一个master下面slaves的链接以外,还可以接受同一个结构图中的其他slaves的链接. redis复制是在master段是非阻塞的,这就意味着master在同一个或多个

JAVA: httpclient 详解——第二章;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

VC++深入详解1--Win32程序

创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序实现的步骤为: 1.WinMain函数的定义: 2.创建一个窗口: 3.进行消息循环: 4.编写窗口过程函数. VC++深入详解1--Win32程序,布布扣,bubuko.com

第三章线程同步辅助类

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第三章线程同步辅助类 3.1简介 ?信号量(Semaphore):是一种计数器,用来保护一个或者多个共享资源的访问.它是并发编程的一种基础工具,大多数编程语言都提供了这个机制. ? CountDownLatch:是Java语言提供的同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许线程一直等待. ? CyclicBarrier也是Java语言

第二章线程同步基础

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第二章线程同步基础 2.1简介 多个执行线程共享一个资源的情景,是最常见的并发编程情景之一.在并发应用中常常遇到这样的情景:多个线程读或者写相同的数据,或者访问相同的文件或数据库连接. 为了防止这些共享资源可能出现的错误或数据不一致,我们必须实现一些机制来防止这些错误的发生. 为了解决这些问题,引入了临界区(Critical Section)概念,临

线程同步——内核对象实现线程同步——信号量

1 /* 2 3 信号量内核对象 4 信号量与其它内核量相同,包含一个使用计数,除此之外还包含两个量. 5 一个最大资源计数和一个当前资源计数. 6 信号量规则如下: 7 如果当前资源计数大于0,那么信号量处于触发状态. 8 如果当前资源计数等于0,那么信号量处于未触发状态. 9 系统绝不会让当前资源计数变为负数. 10 当前资源计数绝不会大于最大资源计数. 11 12 下面我们看一下信号量的创建函数 13 HANDLE CreateSemaphore( 14 LPSECURITY_ATTRIB