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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值