今天继续更新《Effective C++》和《C++并发编程实战》的读书笔记,下面是已经更新过的内容:
《C++并发编程实战》读书笔记(1):并发、线程管控
(资料图片)
《C++并发编程实战》读书笔记(2):并发操作的同步
《C++并发编程实战》读书笔记(3):内存模型和原子操作
《C++并发编程实战》读书笔记(4):设计并发数据结构
《Effective C++》读书笔记(1):让自己习惯C++
《Effective C++》读书笔记(2):构造/析构/赋值运算
《Effective C++》读书笔记(3):资源管理
《Effective C++》读书笔记(4):设计与声明
《Effective C++》读书笔记(5):实现
第8章设计并发代码
在线程间切分任务的方法包括:1、先在线程间切分数据再处理。2、以递归的方式划分数据,例如快排中每次以某元素为界将数据集划分为大小两部分然后再递归处理。3、依据工作类别划分任务,每部分代码只承担单一的功能职责。
例如第四章中演示了使用std::async实现并行版快排,也可以自己实现:
影响并发代码性能的因素包括:1、处理器的数量,C++11可以通过std::thread::hardware_concurrency获取硬件线程数量。2、数据竞争和缓存乒乓,例如循环处理原子变量或加锁时变量所含的数据在不同缓存之间多次来回传递,严重影响程序性能。3、不经意共享,多个线程访问同一个数据的不同元素时可能访问同一个缓存块,造成数据乒乓;C++17定义了std::hardware_destructive_interference_size用于表示一个字节数的限度,数据分布范围超出该值就不会有不经意共享。4、数据的紧凑程度,单个线程访问的数据可能属于不同内存块,C++17定义了std::hardward_constructive_interference_size表示同一缓存块保证容纳的最大连续字节数。5、过度任务切换和线程过饱和。
还有一些要额外考虑的因素:1、异常安全,某线程上有函数因异常而退出会导致整个程序被终结。2、可伸缩性,尽可能令并发程度达到最大并确保实际工作量足以让多个处理器有效运行。3、利用多线程掩藏等待行为,提高响应能力。
下面是标准库部分并行化实现的例子。
首先是for_each,使用RAII类join_threads,用future
接着是find,使用std::promise在工作线程中设定最终结果,查找到后设置原子变量done_flag终止其他线程。
你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。
我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。
欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。
加个微信,打开另一扇窗