当前位置: 首页 > 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…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...