《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++ 线程的方法和属性:
-
joinable()
判断线程是否可连接(可执行线程)的,有以下情况的,为不可连接的:- 构造时,
thread()
没有参数; - 该对象的线程已经被移动了;
- 该线程已经被
join
或detach
;
- 构造时,
-
get_id()
返回线程的ID; -
native_handle()
返回POSIX
标准的线程对象; -
join()
等待线程执行完成; -
detach()
分离线程,分离后对象不再拥有线程。该线程结束后,会自动回收内存。(并不会开启另一个进程); -
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_source
、get_stop_token
、request_stop
等方法来对其进行操作。
stop_token
类似于一个信号,告诉线程是否到了结束的时候。和 stop_source
一起使用。stop_token
用来获取是否退出,而 stop_source
用来请求退出。其方法:
总结:
jthread
即是通过 RAII 机制封装的 thread,其会在析构时自动调用 join
防止线程 crash。
C++20的这些新特性,你都知道吗? - 知乎 (zhihu.com)
Thread - 随笔分类 - ink19 - 博客园 (cnblogs.com)