c++11 多线程 1<<c++ concurrency in action>>

一、并行、多线程

1、计算机中的并行有两种方式:任务切换、利用多处理器多核。

纯粹的任务切换:

 

纯粹的多处理器多核:

 

任务切换与多处理器多核结合:

 

实际应用中是“任务切换与多处理器多核结合”方式,首先现在硬件偏移单处理器单核淘汰“纯粹的任务切换”已不在,“纯粹的多处理器多核”每个核分配一个进程(线程),进程(线程)数目收到严格限制。

2、编程所用的并行单位:将任务分解为进程或线程

 

优点

缺点

进程(线程)间通信方式

C++标准支持

 

进程

系统对它的安全进行部分管制;可以利用网络通信;通信少了很简单(属于高层接口)

通信多了就复杂、慢、甚至不可能,因为系统对进程间通信的安全部分管制;进程间切换慢

Signals/sockets/files/pipes

线程

同一个进程的所有线程共享同一地址空间,通信简单、灵活;线程间切换迅速

数据的安全难保证

共享地址空间

C++使用的并行单位是线程。

二、为什么使用并行?

1、提供一种自然的思考方式,简化设计;

2、提高性能,可以task parallelism(将应用分解为任务)、data parallelism(将数据分解为不同的部分);

三、什么时候不使用并行?

利大于弊。利:一种自然的思考方式、性能;弊:编程复杂、线程切换费时。

四、c++标准线程库的效率:

很多要求高性能的程序员在使用c++时候都担心abstraction penaltyc++标准委员在设计标准库的时候考虑到了这个,尤其是线程库,他们承诺:there should be little or no benefit to be gained from using the lower-level APIs directly提供两种接口low-levelhigh-levellow-level在新的内存模型上提供原子操纵库,这些原子操作甚至可以替代以前要用基于平台的汇编写的程序。High-level接口并没有太多的abstraction penalty标准库承诺它的功能跟你自己手写函数调用Low-level接口效率一样,并且进行了很好的内联。High-level可能包含一些函数你不需要,但是千万别自己去用low-level去实现,得不偿失,在使用STL的一个被证实的事实是:瓶颈在于你的应用程序的设计而不是库的实现。

 

例子很简单,不解释了。

原文地址:https://www.cnblogs.com/jiafenggang/p/5482533.html