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

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

 


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

缺点:通讯复杂耗时,操做系统开销较大。安全

优势:更容易写出安全的并发代码,能够将进程分配到独立的机器上,经过网路通讯。
多线程并发:
多线程

同一个进程中全部线程共享地址空间,(尽管也能够在多进程间共享memory, 但创建复杂,且不易于管理,这是由于相同数据的内存地址,在不一样进程中并不须要同样)并发

优势:系统开销更小,通讯开销小性能

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

 

3. 为何使用并发spa

使用并发主要是基于两个缘由,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

相关文章
相关标签/搜索