当前位置: 首页 > news >正文

C++并发编程实战——01.并发与并行

文章目录

  • 并发并行及其使用原因
    • 并发与并行
    • 使用与不使用并发的原因
    • C++多线程支持

并发并行及其使用原因

本书相关

  • github翻译地址
  • 本书源码下载地址
  • 第一版github 翻译地址
  • 英文原版PDF
  • 不错的笔记
  • 所有实例的源代码,可在出版商的网站上进行下载
  • github上下载源码

路线图

  • 前4章,介绍了标准库中的各种工具,展示使用方法。
  • 第5章,涵盖了内存模型和原子操作,包括原子操作如何对执行顺序进行限制(这章标志着介绍部分的结束)。
  • 第6、7章,开始讨论高级主题,如何使用基本工具去构建复杂的数据结构——第6章是基于锁的数据结构,第 7章是无锁数据结构。
  • 第8章,针对设计多线程代码给了一些指导意见,覆盖了性能问题和并行算法。
  • 第9章,线程管理——线程池,工作队列和中断操作。
  • 第10章,介绍C++17中标准库算法对并行性的支持。
  • 第11章,测试和调试——Bug类型,定位Bug的技巧,以及如何进行测试等等。
  • 附录,包括新标准中语言特性的简要描述,主要是与多线程相关的特性,以及在第4章中提到的消息传递库的实现细节和C++17线程库的完整的参考。

并发与并行

并发:指两个或两个以上的独立活动同时发生。

多处理器服务器很早就实现了并行计算。基于单芯多核处理器(多核处理器)的台式机能够真正的并行多个任务,我们称其为”硬件并发“。

并发的两种方式:真正并行任务切换

即便是硬件并发的系统,也有比硬件“可并行最大任务数”还要多的任务需要执行,所以任务切换在这些情况下仍然适用。实际上,许多因素会使得任务分割不均或调度不规则。

无论应用是在单核处理器,还是多核处理器上运行,不论是任务切换,还是硬件并发,这里提到的技术、功 能和类都会涉及。如何使用并发,很大程度上取决于可用的硬件并发。

  • 多进程并发
    • 优点:操作系统会对进程进行保护,更容易编写 安全的并发代码。
    • 缺点:运行多个进程的固定开销:需要时间启动进程,操作系统需要 资源来管理进程。
  • 多线程并发
    • 共享地址空间(全局变量仍是全局的,指针、对象的引用或数据可在线程之间传递)。
    • 同一数据的内存地址在不同的进程中不相同,所以这种共享难以建立和管理。
    • 缺少线程间的数据保护,使得操作系统记录的工作量减小。必须确保每个线程所访问 到的数据一致,这就需要对线程通信做大量的工作。
    • C++标准并未对进程通信提供原生支持,所以实现会依赖于平台相关的API。
    • 对线程的划分是基于概念上的设计,所以线程数不再依赖CPU核芯数。

并发与并行的区别:两个概念大部分是重叠,为了区别多线程中不同的关注点。

  • “并行”更加注重性能。使用硬件提高数据处理速度时,会讨论程序的并行性。
  • 关注重点在于任务分离或任务响应时,会讨论程序的并发性。

使用与不使用并发的原因

  • 使用——分离关注点

    将相关的代码与无关的代码分离,可以使程序更容易理解和测试,从而减少出错的可能。不显式地使用并发,就得编写一个任务切换机制,或者在操作中主动地调用一段不相关代码。

  • 使用——性能

    并发利用方式:

    • 一个单个任务分成几部分并行运行,从而降低总运行时间,这就是任务并行(task parallelism)。但是各个部分之间可能存在着依赖。
    • 每个线程在不同的数据块上执行相同的操作,称为数据并行(data parallelism)

    容易并行的算法称为是“易并行的”(embarrassingly parallel),直接直接硬件线程数量。

  • 不使用——收益比不上成本

线程资源有限,启动与切换线程有额外开销。管线程池(参见第9章)可以用来限制线程的数量。

C++多线程支持

C语言中流行的多线程API——POSIX标准中的C标准和 Microsoft Windows API——很多C++编译器供应商,通过各种平台相关的扩展来支持多线程,也有MFX应用框架和BOOST和ACE通用库。

C++标准库也扩展了:管理线程(参 见第2章)、保护共享数据(参见第3章)、线程间同步操作(参见第4章),以及原子操作(参见第5章)。

C++14中为并发和并行添加了一个新的互斥量类型,用于保护共享数据(参见第3章)。C++17考虑的更多:添加了一整套的并行算法(参见第10章)。

为了效率,C++整合了一些底层工具。这样就需要了解使用高级工具和 使用低级工具的开销差,这个开销差就是抽象代价(abstraction penalty)。

为了达到终极性能,需要给与硬件打交道的开发者提供足够多的底层工具。原子操作库,可直接控制单个位、字节、内部线程间的同步,以及对所有变化的可见性

在C++线程库中提供一个native_handle()的成员函数,允许通过使用平台相关API直接操作底层实现。

总结

从1998标准中完全缺乏支持,经历了各种平台相关的扩展,再到C++11/C++14/C++17标准和并发技术规范对多线程的支持。芯片制造商选择了以多核芯的形式,使得更多任务可以同时执行的方式来增加处 理能力,而不是增加单个核心的执行速度。在这个趋势下,C++多线程来的正是时候,它使得开发者们可以利用CPU带来的更加强大的硬件并发。

相关文章:

C++并发编程实战——01.并发与并行

文章目录 并发并行及其使用原因并发与并行使用与不使用并发的原因C多线程支持 并发并行及其使用原因 本书相关 github翻译地址本书源码下载地址第一版github 翻译地址英文原版PDF不错的笔记所有实例的源代码,可在出版商的网站上进行下载github上下载源码 路线图 …...

PLC如何远程控制、调试?贝锐蒲公英二层组网功能一招搞定

在制造、交通、能源、采矿等领域,工业物联网是热门话题,各类采集、控制器、控制传感器通过网络互联,实现信息实时共享、交互后,不仅能快速了解生产过程数据,还能用于设备远程、调试维护等场景,对优化生产过…...

【大数据】-- flink kubernetes operator 入门与实践

课程链接:https://edu.csdn.net/course/detail/38831 目录 课程链接:https://edu.csdn.net/course/detail/38831https://edu.csdn.net/course/detail/38831 一、你将收获...

网络安全在代理技术中的实现与应用

随着互联网技术的飞速发展,网络安全日益受到人们的重视。在这个背景下,代理技术成为了网络安全实现的重要手段之一。本文将针对 SOCKS5 代理、SK5 代理、IP 代理等代理技术,探讨它们在网络安全和爬虫应用中的重要性,并介绍 HTTP 协…...

Nginx搭配负载均衡和动静分离:构建高性能Web应用的完美组合

目录 前言 一、Nginx简介 1.Nginx是什么 2.Nginx的特点 3.Nginx在哪使用 4.如何使用Nginx 5.Nginx的优缺点 6.Nginx的应用场景 二、负载均衡和动静分离 1.负载均衡 2.动静分离 三、Nginx搭载负载均衡并提供前后端分离后台接口数据 1.Nginx安装 2.tomcat负载均衡 …...

windows 运行 Mysql Command Line Client 自动关闭闪退原因分析

目录 原因分析一 原因分析二 原因分析三 第一次使用 MySQL Command Line Client 有可能输入密码后一按下回车键,程序窗口就自动关闭,出现闪退现象。本节主要分析产生闪退现象的原因以及如何处理这种情况。 原因分析一 首先可以查看程序默认执行文件…...

在CATIA工程制图中自动生成尺寸

然后微调即可...

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目: 思路: 代码: 2、等差数列 题目: 思路: 代码: 3、顺子日期 题目: 思路: 代码: 4、灌溉 题目: 代码: 1、求和…...

Spring AOP基于XML方式笔记整理

XML AOP 加载流程 ClassPathXmlApplicationContext#refreshAbstractApplicationContext#obtainFreshBeanFactoryAbstractRefreshableApplicationContext#refreshBeanFactory创建DefaultListableBeanFactoryAbstractApplicationContext#loadBeanDefinitions(beanFactory)创建Xm…...

Docker HTTP(S) Proxy代理方式连接互联网

Docker HTTP(S) Proxy 是一种在 Docker 容器内部设置 HTTP(S) 代理的方法,以便于容器内的应用程序可以方便地通过代理访问互联网。设置 HTTP(S) 代理的方法主要有两种:使用 Dockerfile 配置和在使用 docker run 时添加参数。 以下是使用 Docker HTTP(S) …...

华纳云:centos系统中怎么查看cpu信息?

在CentOS系统中,我们可以使用一些命令来查看CPU的详细信息。下面介绍几个常用的命令: 1. lscpu lscpu命令可以显示CPU的架构、型号、核心数、线程数、频率等信息。 # lscpu 执行以上命令后,会输出类似以下内容: 2. cat /proc/…...

如何选择微信管理系统?

如何选择微信管理系统? 1、不用下载安装软件,不越狱不刷机 2、不绑定手机或电脑,不对电脑或手机做限制,也不受电脑、手机关闭、关机影响 3、能更新迭代,不限制版本 4、使用安全登录,保障账号安全的 5、不用…...

文字的力量

不知道以前的时代的年轻人有没有这样的感受。现在我觉得自己是不是出现了认知偏差,发现在很多描写现在的二十几岁年轻人的成长经历的文字下面都会出现很多共鸣,包括我自己也有,就让我有一个错觉:是不是中国所有的和我同龄的年轻人都是这样过来…...

荒野大镖客emp.dll文件丢失的怎么办,快速修复游戏dll问题

在玩荒野大镖客这款游戏的过程中,我遇到了一个令人困扰的问题——emp.dll文件丢失。emp.dll是荒野大镖客游戏中的一个动态链接库文件,它负责管理游戏中的一些功能模块。当这个文件丢失时,游戏可能无法正常运行,导致一些功能无法使…...

力扣labuladong——一刷day20

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言差分数组工具类一、力扣370. 区间加法二、力扣1109. 航班预订统计三、力扣1094. 拼车 前言 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减…...

XSpirit 2智能边缘计算机使用测评

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 拆箱过程介绍视频使用感受 我之前就参加过 Spirit 1 第一代智能边缘计…...

python实现MC协议(SLMP 3E帧)的TCP服务端(篇二)

python实现MC协议(SLMP 3E帧)的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模…...

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具: nodejs,mysql5.7,HBuilder X,vscode(webstorm) 技术说明: nodejs express vue elementui uniapp 功能介绍: 用户端: 登录注册 首页显示轮播图&am…...

从零开始的目标检测和关键点检测(一):用labelme标注数据集

从零开始的目标检测和关键点检测(一):用labelme标注数据集 1、可视化标注结果2、划分数据集3、Lableme2COCO,将json文件转换为MS COCO格式 前言:前段时间用到了mmlab的mmdetction和mmpose,因此以一个小的数…...

【JVM经典面试题(五十二道)】

文章目录 JVM经典面试题(五十二道)引言1.什么是JVM 内存管理2.能说一下JVM的内存区域吗?3.说一下JDK1.6、1.7、1.8内存区域的变化?4.为什么使用元空间替代永久代作为方法区的实现?5.对象创建的过程了解吗?6…...

高效管理:在文件夹名称左边添加关键字,实现批量重命名

在高效的文件管理中,对文件夹进行合理命名和重命名是十分关键的。有时候,我们可能需要在一批文件夹的名称左边添加特定的关键字,以便更好地组织和管理这些文件夹。为了实现这个目标,我们可以使用云炫文件管理器一些简单的步骤来实…...

Leetcode1122. 数组的相对排序

Every day a Leetcode 题目来源:1122. 数组的相对排序 解法1:哈希 用集合 set 存储 arr2 中的元素。 遍历数组 arr1 ,设当前元素为 num: 如果 num 在 set 中出现,用哈希表 hash 记录 num 和它出现的次数。否则&a…...

CN考研真题知识点二轮归纳(5)

本轮的最后一贴,真题中涉及计网的部分彻底总结完!后期的3轮总结可能会上一些大题,比如路由转发、子网划分什么的,以及重点的背诵内容~ 上期目录: CN考研真题知识点二轮归纳(4)https://jslhyh32…...

windows系统 生成RSA密钥对

在Windows系统上生成密钥对,可以使用多种方法,这里将介绍两种常用的方法: 方法1: 使用PuTTYgen PuTTYgen是PuTTY套件的一部分,是在Windows上生成SSH密钥对的一个流行工具。如果你的目的是SSH密钥对,你可以这样操作&a…...

大文件分片上传并发

我这边使用的是boostrap-fileimput 初始化文件上传框 $(document).ready(function () {$("#file-upload_import").fileinput({uploadUrl: "#",language: "zh", //设置语言showPreview: true,autoReplace: true,// uploadUrl: "/uact/uploa…...

数据结构——基于顺序表实现通讯录

一、. 基于动态顺序表实现通讯录 1.1 功能要求 1)⾄少能够存储100个⼈的通讯信息 2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等 3)增加联系⼈信息 4)删除指定联系⼈ 5)查找制定联系⼈ 6&…...

行业追踪,2023-11-03

自动复盘 2023-11-03 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...

JSPv2之El

​ (一)EL的基本语法 1优点 1 jsp的java太长了,el自己的语言${ 开始 }结束 2el直接返回空字符转,而java直接报错 3使用“lt”代替“<”运算符&#xff0c;如果运算符后面是数字&#xff0c;在运算符 *EL取值时&#xff0c;没有数组的下标越界&#xff0c;没有…...

出现 gpg: cancelled by user时的处理方法

今天在使用git commit -S -m "comment" check in 代码的时候&#xff0c; 莫名其妙出现了以下错误&#xff1a; gpg: cancelled by user经过在网上查询资料&#xff0c; 本质原因是GnuPG没有$(tty)的读写权限&#xff0c;有以下两种解决方法是靠谱的&#xff1a; c…...

MySQL中表的增删改查

目录 一、CRUD 二、新增&#xff08;Create&#xff09; &#xff08;1&#xff09;语法 &#xff08;2&#xff09;单行数据全列插入 &#xff08;3&#xff09;多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09; &#xff08;1&#xff09;语法 …...