C++ Concurrency in Action 2nd Edition

《C++ Concurrency in Action - SECOND EDITION》的中文翻译-面圈网 (mianshigee.com)

C/C++ 学习教程源码-C/C++源码推荐-面试哥 (mianshigee.com)

作者正是为C++11标准引入线程库的C++标准委员会成员本人!并且本书作者还编写了众多构成C++标准的多线程和并发相关的提案、制定了并发技术规约(Concurrency Technical Specification),以及关于C++未来演化发展的提案。

《C++并发编程实战 第2版》是作者多年心血的凝聚。这本书基于他研习C++和多线程的全部经验,旨在指导其他C++开发者安全且高效地使用C++线程库和并发技术规约。可以说跟着这本书学习C++并发编程,就是在跟着标准学习了,这本书的权威性毋庸置疑

细心的同学肯定发现了,人邮君这次推荐的是最新出版的第2版。这是因为《C++并发编程实战》的第1版是以C++11为基础的,但后来C++委员会又相继发布了C++14标准、C++17标准和一些技术规约,进一步为编写多线程程序提供支持,比如C++17可以使用多线程或多处理器,使得图像处理、机器学习等性能敏感型任务更加快速的完成。而《C++并发编程实战 第2版》这本书就覆盖了现代C++的新特性,特别为工业级C++并发解锁了相应的特性、模式和最佳实践方式

  • ● 从C++标准程序库的各种工具讲起,介绍了线程管控、在线程间共享数据、并发操作的同步、C++内存模型和原子操作等内容。
  • ● 内容丰富全面,介绍了基于锁的并发数据结构、无锁数据结构、并发代码,以及高级线程管理、并行算法函数、多线程应用的测试和除错。
  • ● 根据C++14和C++17标准进行更新和修订,涵盖了所有标准中最新的改动。第2版为读者展示了如何用C++17写出优雅且健壮的多线程应用,并告诉你所有的细节。
  • ● 通过附录及线上资源提供了丰富的补充资料,以帮助读者更完整、细致地掌握C++并发编程的知识脉络。

不仅知识结构完整,本书还特别呼应“In Action”(实战)的主题,在每一章中都提供了示例和练习,以及本书作者——C++标准委员会成员、并发编程大师安东尼·威廉姆斯的一些独到见解,这对于开发人员来说是非常有价值的。

本书中所举的例子简洁而有代表性,比如:

  • ● 基于锁的并发数据结构的设计(Designing lock-based concurrent data structure)
  • ● 无锁并发数据结构的设计(Designing lock-free concurrent data structure)
  • ● 并发代码的设计(Designing concurrent code)
  • ● 高级线程管理(Advanced thread management)
  • ● 并行算法(Parallel algorithm)
  • ● 多线程应用的测试与调试(Testing and debugging multithreaded application)

这些例子中的一些代码甚至可以直接照搬到生产环境下使用,相信仔细阅读并实战完之后的你,能收获作者对多线程程序设计的一些很有价值的经验,能对于底层有更深入的认知。

本书译者与作者进行了大量邮件沟通,反复推敲,确保全书的翻译准确到位、简洁易懂。此外,译者还基于自己的开发经验,补充了许多延伸知识点,更为读者们提供了近200页的电子版附录D以及140多份配套代码文件。直接为读者打消了翻译版图书水土不服的顾虑!(真的吗?人邮哎,嘿嘿!)

https://github.com/xiaoweiChen/CPP-Concurrency-In-Action-2ed-2019

C++ 那些事

GitHub - Light-City/CPlusPlusThings: C++那些事

感谢各位对《C++ 那些事》的支持,现将内容也同步至B站,以视频的方式展示,可以打开网站直接阅读~欢迎大家 star、转发、PR。

网站:C++那些事

  • 中文名:C++ 那些事
  • 英文名:Stories About C Plus Plus

这是一个适合初学者从入门到进阶的仓库,解决了面试者与学习者想要深入 C++ 及如何入坑 C++ 的问题。除此之外,本仓库拓展了更加深入的源码分析,多线程并发等的知识,是一个比较全面的 C++ 学习从入门到进阶提升的仓库。

Cmake 官方教程(翻译)-面圈网 (mianshigee.com)

一个现代c++语言和库功能的速查表-面圈网 (mianshigee.com)

GitHub - AnthonyCalandra/modern-cpp-features: A cheatsheet of modern C++ language and library features.

编程之法:面试和算法心得-面圈网 (mianshigee.com)

GitHub - julycoding/The-Art-Of-Programming-By-July-2nd: 本项目曾冲到全球第一,干货集锦见本页面最底部,另完整精致的纸质版《编程之法:面试和算法心得》已在京东/当当上销售

GitHub - chunhuajiang/arm-gcc-inline-assembler: ARM GCC 内联汇编参考手册 - 中文版

C++ 线程的方法和属性:

  1. joinable()判断线程是否可连接(可执行线程)的,有以下情况的,为不可连接的:

    1. 构造时,thread()没有参数;
    2. 该对象的线程已经被移动了;
    3. 该线程已经被 join 或 detach
  2. get_id() 返回线程的ID;

  3. native_handle() 返回 POSIX 标准的线程对象;

  4. join() 等待线程执行完成;

  5. detach() 分离线程,分离后对象不再拥有线程。该线程结束后,会自动回收内存。(并不会开启另一个进程);

  6. swap() 交换对象的线程。

C++20 jthread:

std::jthread 在 std::thread 基础上,增加了能够主动取消或停止线程执行的新特性。与 std::thread 相比,std::jthread 具有异常安全的线程终止流程,并且在大多数情况下可以替换它,只需很少或无需更改代码。

A std::thread instance can be in either the joinable or unjoinable state. A std::thread that is default constructed, detached, or moved is unjoinable. We must join a joinable std::thread explicitly before the end of its life; otherwise, the std::thread's destructor calls std::terminate, whose default behavior is to abort the process. std::thread 实例可以处于可联接或不可联接状态。默认构造、分离或移动的 std::thread 不可联接。我们必须在可连接的 std::thread 生命周期结束之前显式加入它;否则,std::thread 的析构函数将调用 std::terminate,其默认行为是中止进程。

void FuncWithoutJoinOrDetach() {std::thread t{task, task_args};// 没有调用 t.join() 或 t.detach()}  // t 的生命周期结束时将调用 std::terminate(),异常结束程序

C++11 中 thread 对象如果在销毁之前处于可 join 的状态,却没有 join 的话,将会引发一个异常。 

以上述代码所示,如果没有调用 t.join() 或 t.detach(),当线程对象 t 生命周期结束的时候,可能会产生 core dump导致程序异常终止。 上述例子中,在实例化对象 t 后,即使调用线程 t 的 join()函数,有时候可能需要等待很长时间才能将线程 t 的 task 执行完成,甚至是永久的等待(例如 task 中存在死循环),由于 thread 不像进程一样允许我们主动将其 kill 掉,所以当 t 中出现死循环,会导致无法继续执行 jion() 之后的语句,已经启动的线程只能自己结束运行或结束整个程序来结束该线程。 基于以上两个主要原因,在 C++20 中引入 std::jthread 类,来弥补 std::tread 的缺陷,其除了拥有 std::thread 的行为外主要新增了以下两个功能:

  • std::jthread 对象被析构时,会自动调用 join,等待其所表示的执行流结束。
  • std::jthread 支持外部请求中止(通过 get_stop_source、get_stop_token 和 request_stop )。

std::jthread 中的自动 join 和外部请求中止功能使编写更安全的代码变得更加容易,但其性能上相对于 thread 也增加了开销

thread 和 jthread之间的差别比较明显的就是,std::jthread 会在解构的时候判断线程是否还在运行joinable,如果还在运行则自动调用 request_stop 和 join

jthread 的析构函数的简单实现:

除此之外,std::jthread 还提供了一个内置的 std::stop_token。可以通过线程函数的第一个参数来获取(如果函数的第一个参数类型为std::stop_token)。

可以通过 get_stop_sourceget_stop_tokenrequest_stop 等方法来对其进行操作。

stop_token 类似于一个信号,告诉线程是否到了结束的时候。和 stop_source 一起使用。stop_token 用来获取是否退出,而 stop_source 用来请求退出。其方法:

总结:

jthread 即是通过 RAII 机制封装的 thread,其会在析构时自动调用 join 防止线程 crash。

C++20的这些新特性,你都知道吗? - 知乎 (zhihu.com)

Thread - 随笔分类 - ink19 - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/185638.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCE8 资料整理(五)

RHCE8 资料整理 第五篇 系统管理第18章 进程管理18.1 进程介绍18.2 查看进程18.3 向进程发送信号18.4 进程优先级 第19章 日志19.1 rsyslog的配置19.2 查看日志 第20章 网络时间服务器20.1 时间同步必要性20.2 配置时间服务器20.3 配置客户端 第21章 计划任务21.1 at21.2 cront…

VSCode修改主题为Eclipse 绿色护眼模式

前言 从参加开发以来,一直使用eclipse进行开发,基本官方出新版本,我都会更新。后来出来很多其他的IDE工具,我也尝试了,但他们的主题都把我劝退了,黑色主题是谁想出来?😂 字体小的时…

2023年眼镜行业分析(京东眼镜销量数据分析):市场规模同比增长26%,消费需求持续释放

随着我国经济的不断发展,电子产品不断普及,低龄及老龄人口的用眼场景不断增多,不同年龄阶段的人群有不同的视力问题,因此,视力问题人口基数也随之不断加大,由此佩戴眼镜的人群也不断增多。 同时&#xff0c…

华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)

1.拓扑图 2.过程如下 2.1 首先PC1和PC2配置好IP地址 2.2 在SW1上配置虚拟网关及VLAN <Huawei>system-view [Huawei]sysname SW1 [SW1]undo info-center enable [SW1] [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet 0/0/1 [SW1-GigabitEthernet0/0/1]port li…

Ubuntu22.04配置Go环境

Ubuntu上配置Go环境biCentOS简单多了&#xff0c;有两种方案&#xff0c;一种直接使用apt进行安装&#xff0c;一种自己从官网下载安装包进行安装。 1、使用apt直接安装 更新apt安装包&#xff0c;常规操作 apt update 然后看看apt自带的Go版本是多少 apt list golang 是1…

Git 入门使用

一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git是目前世界上最先进的分布式版本控制系统&#xff0c;没有之一&a…

【自然语言处理】基于python的问答系统实现

一&#xff0c;文件准备 该问答系统是基于已知的问题和其一一对应的答案进行实现的。首先需要准备两个文本文件&#xff0c;分别命名为“question.txt”和“answer.txt”&#xff0c;分别是问题文件和答案文件&#xff0c;每一行是一个问题以及对应的答案。 问题文件: 中国的首…

vue前端实现多个url下载并合并为zip文件

一、安装 npm install jszip npm install file-saver 二、引入 import axios from axios import JSZip from "jszip"; import FileSaver from "file-saver"; 三、核心代码 videoData:[/video/26519f026fc012521605563015227403.mp4,/video/f7b9cdae14…

运营商大数据精准获客:我们提供精准客源渠道的最大资源体?

运营商大数据精准营销 谈起精准获客&#xff0c;竞争对手永远是为我们提供精准客源渠道的最大资源体&#xff01; 最新的获客方式&#xff0c;就是从竞争对手的手中把他们的精准客户资源变为自己的。 今年最火的运营商大数据精准营销是拒绝传统营销方式的烧钱推广&#xff0…

无人机航迹规划:七种智能优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划--提供MATLAB代码

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

【STM32】TIM2的PWM:脉冲宽度调制

PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 0.通用寄存器输出 1.捕获/比较通道1的主电路--中间部分 2.捕获/比较通道的输出部分--输出 3.通用定时器输出PWM原理 PWM波周期或者频率由ARR&#xff08;就是要进递增/递减的值&#xff09;决定&#xff0c;PWM波占空比由…

力扣每日一题 ---- 2906. 构造乘积矩阵

这题很简单(一下就能想到是前缀和的提米)&#xff0c;但是在处理12345上面需要仔细一点&#xff0c;本来我最开始想到的时候全部累乘在除掉当前数&#xff0c;但是这样就没有把12345考虑进去&#xff0c;如果他本身是12345的话&#xff0c;那么除他以外的乘积并不一定是0&#…

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存&#xff1a; 浏览器发起请求&#xff0c;查询浏览器的本地缓存&#xff0c;如果找到资源&#xff0c;则直接在浏览器中使用该资源。若是未找到&#xff0c;或者资源已过期&#xff0c;则浏览器缓存返回未…

Pytest插件

官方文档&#xff1a;API Reference — pytest documentation BaseReport 定义Case结果输出 >>> from _pytest.reports import TestReport >>> test TestReport(1,1,1,pass,,running) >>> print(dir(test)) [__annotations__, __class__, __delatt…

基础课26——业务流程分析方法论

基础课25中我们提到业务流程分析方法包括以下几种&#xff1a; 价值链分析法&#xff1a;主要是找出或设计出哪些业务能够使得客户满意&#xff0c;实现客户价值最大化的业务流程。要进行价值链分析的时候可以从企业具体的活动进行细分&#xff0c;细分的具体方面可以从生产指…

UserAgent使用隧道HTTP代码示例

首先&#xff0c;我们需要安装一个Perl模块来处理HTTP请求&#xff0c;然后&#xff0c;我们需要配置代理信息&#xff0c;如proxy_host和proxy_port。接下来&#xff0c;我们可以使用正则表达式来解析网页内容并提取我们需要的信息。最后&#xff0c;我们可以将这些信息存储到…

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…

java版本转换小工具

工作之余写了一个转换小工具&#xff0c;具有以下功能&#xff1a; 时间戳转换Base64编码/解码URL编码/解码JSON格式化 时间戳转换 package org.binbin.container.panel;import javax.swing.*; import java.awt.*; import java.text.DateFormat; import java.text.SimpleDat…

【pytest】html报告修改和汉化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…