《c++ concurrency in action》读书笔记1

1. 什么是并发
通俗来说,并发指两个或者多个独立的事件(活动)同时发生。比如,一边走路一边说话,两个手同时做不同的事情。
计算机系统的并发是指一个系统并行处理多个独立的事件(活动), 而不是按顺序或者一个接一个的处理。 在单处理器单核系统中通过task switching的方式实现并发。在多处理器或者多核计算机中,可以实现真正意义的并发,我们将其称为硬件并发。在硬件并发的机器上,task switching也是经常发生的,这是因为并发的作业数,可能会多于硬件线程数。
下图描述的是4个task在两个core上运行的场景:

 


2. 并发的方式
多进程并发:即将应用分成多个独立的单线程的进程服务

缺点:通信复杂耗时,操作系统开销较大。

优点:更容易写出安全的并发代码,可以将进程分配到独立的机器上,通过网路通信。
多线程并发:

同一个进程中所有线程共享地址空间,(尽管也可以在多进程间共享memory, 但建立复杂,且不易于管理,这是因为相同数据的内存地址,在不同进程中并不需要一样)

优点:系统开销更小,通信开销小

缺点:需要解决多线程间数据一致性问题。

 

3. 为什么使用并发

使用并发主要是基于两个原因,separation of concerns 和性能。

separation of concerns: 将相关的代码组织在一起,将不相关的代码分开,让程序易于理解和测试,进而减少bug

 

4. 什么时候不使用并发

当并发带来的好处不值得cost时,就不应该使用并发。因为使用并发的代码更难以理解,编写和维护,而且可能会有更多的bug。

需要注意的是:

a. 并发带来的性能提升,可能没有预期的那么大,因为线程也会带来许多额外的开销(操作系统需要分配内核资源,栈空间,并增加新的线程到调度器中,这些都会增加时间)

b. 线程是有限的资源,当线程数量太多是会导致整个系统运行变慢. 甚至,因为每个线程有独立的栈空间,大量的线程会耗尽可用的memory或者进程的地址空间, 特别对32位的进程来说,可用的地址空间为4GB, 在许多系统中每个线程有1M的栈空间, 4096个线程就会耗尽地址空间。

c. 线程越多,操作系统要做的上下文切换越多。

 

5. C++中的并发与多线程

C++11中,一个重要的feature就是对多线程的支持,不仅包括全新的线程感知内存模型,还扩展了线程管理,共享数据保护,线程间的同步和原子操作。

C++11在多线程方面的性能,相对低层api,  c++库额外的开销是抽象带来的开销,但c++线程库设计的一个目标即这种性能损耗很少或没有。

对于一些平台特有的特性,可使用native_handle调用.


6. 例子 hello world

 

猜你喜欢

转载自www.cnblogs.com/maoyin/p/10742260.html