一、并行、多线程
1、计算机中的并行有两种方式:任务切换、利用多处理器多核。
纯粹的任务切换:
纯粹的多处理器多核:
任务切换与多处理器多核结合:
实际应用中是“任务切换与多处理器多核结合”方式,首先现在硬件偏移单处理器单核淘汰“纯粹的任务切换”已不在,“纯粹的多处理器多核”每个核分配一个进程(线程),进程(线程)数目收到严格限制。
2、编程所用的并行单位:将任务分解为进程或线程
|
优点 |
缺点 |
进程(线程)间通信方式 |
C++标准支持
|
进程 |
系统对它的安全进行部分管制;可以利用网络通信;通信少了很简单(属于高层接口) |
通信多了就复杂、慢、甚至不可能,因为系统对进程间通信的安全部分管制;进程间切换慢 |
Signals/sockets/files/pipes |
否 |
线程 |
同一个进程的所有线程共享同一地址空间,通信简单、灵活;线程间切换迅速 |
数据的安全难保证 |
共享地址空间 |
是 |
C++使用的并行单位是线程。
二、为什么使用并行?
1、提供一种自然的思考方式,简化设计;
2、提高性能,可以task parallelism(将应用分解为任务)、data parallelism(将数据分解为不同的部分);
三、什么时候不使用并行?
利大于弊。利:一种自然的思考方式、性能;弊:编程复杂、线程切换费时。
四、c++标准线程库的效率:
很多要求高性能的程序员在使用c++时候都担心abstraction penalty,c++标准委员在设计标准库的时候考虑到了这个,尤其是线程库,他们承诺:there should be little or no benefit to be gained from using the lower-level APIs directly。提供两种接口low-level、high-level,low-level在新的内存模型上提供原子操纵库,这些原子操作甚至可以替代以前要用基于平台的汇编写的程序。High-level接口并没有太多的abstraction penalty,标准库承诺它的功能跟你自己手写函数调用Low-level接口效率一样,并且进行了很好的内联。High-level可能包含一些函数你不需要,但是千万别自己去用low-level去实现,得不偿失,在使用STL的一个被证实的事实是:瓶颈在于你的应用程序的设计而不是库的实现。
例子很简单,不解释了。