C++并发编程实战读书笔记

一、C++的并发世界

并发,两个或者更多的独立活动同时发生。

1、两种方式:

A.单核机器的任务切换

任务切换太快,造成“并发假象”,上下文切换有时间开销,保存CPU状态和指令指针。

B.多核机器的真正并发

硬件线程(hardware threads) 最重要的因素是数量,也就是硬件上可以并发运行多少独
立的任务。即便是具有真正硬件并发的系统,也很容易拥有比硬件“可并行最大任务数”还要多
的任务需要执行,所以任务切换在这些情况下仍然适用
 

2、并发的途径

a.多进程并发

将应用程序分为多个独立的进程

优点:

可以编写更安全的代码

可以远程连接,跨主机

缺点:

进程启动时间开销

进程间通信开销

b.多线程并发

单进程中运行多个线程

进程中的所有线程都共享地址空间,
并且所有线程访问到大部分数据———全局变量仍然是全局的,指针、对象的引用或数据可
以在线程之间传递

地址空间共享,以及缺少线程间数据的保护,使得操作系统的记录工作量减小,所以使用多
线程相关的开销远远小于使用多个进程。不过,共享内存的灵活性是有代价的:如果数据要
被多个线程访问,那么程序员必须确保每个线程所访问到的数据是一致的
 

3、为什么使用并发

关注点分离(SOC)和性能

a.关注点分离

编写软件时,分离关注点是个好主意;通过将相关的代码与无关的代码分离,可以使程序更
容易理解和测试,从而减少出错的可能性。即使一些功能区域中的操作需要在同一时刻发生
的情况下,依旧可以使用并发分离不同的功能区域;若不显式地使用并发,就得编写一个任
务切换框架,或者在操作中主动地调用一段不相关的代码

b.性能

任务并行

将一个单任务分成几部分,且各自并行运行,从而降低运行时间

一个线程执行算法的一部分另一个线程执行算法的另一部分。

数据并行
 

4、什么时候不使用并发

收益?成本?

并发代码的可理解性,编写维护代码的脑力成本,复杂性引起的错误

线程的启动的开销,新线程加入调度器

线程执行的时间和线程启动时间的比率问题

线程太多运行,每个线程都需要一个独立的堆栈空间,线程的上下文切换

5、C++中使的并发和多线程

带锁的资源获取就是初始化(RAII, Resource Acquisition Is Initialization)

构造获锁,析构解锁

抽象惩罚

高级工具性能 可能会低,但简单,不易出错

低级工具,性能提升,但增加额外的复杂性,出错概率

如何衡量?收益?

即便是有证据确实表明瓶颈出现在C++标准库的工具中,也可能会归咎
于低劣的应用设计,而非低劣的类库实现。例如,如果过多的线程竞争一个互斥单元,将会
很明显的影响性能。与其在互斥操作上耗费时间,不如重新设计应用,减少互斥元上的竞争
来的划算
 

二、线程管理

2.1

 

你可能感兴趣的:(多线程)