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



《c++ concurrency in action》读书笔记1的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

  2. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  3. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  4. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  5. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

  6. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  7. 《Linux/Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

  8. 《Linux/Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  9. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  10. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

随机推荐

  1. EXCEL对比在职员工与离职员工

    EXCEL 在B1中 填写这个 =VLOOKUP(A1,C:C,1,0)    然后往下拉  只要有出现#N/A  说明已经离职了 公司需要

  2. Mac Pro 坑记录

    第一天app store没法登陆,登陆后没有任何的反应,试过了改系统时间为一致.修改权限:sudo chmod -R 1777 /Users/Shared 都没什么用. 最后是终端运行: defaul ...

  3. C#发送内置图片的html格式邮件的代码

    将写内容过程经常用的内容段备份一次,下面的内容是关于C#发送内置图片的html格式邮件的内容,应该对码农们也有用处.MailMessage m = new MailMessage();m.Subjec ...

  4. Oarcle之组函数

    组函数 avg 求20部门的平均薪水为多少? select avg(sal) avgsal from emp where deptno = 20:  sum 求20部门的员工的总薪水 select s ...

  5. 数据库表中不建索引,在插入数据时,通过sql语句防止重复添加

    sql 语句 INSERT IGNORE INTO table(aaa,bbb) SELECT '1111','2222' FROM DUAL WHERE NOT EXISTS( ' ) mybati ...

  6. linux中的strings命令

     strings - print the strings of printable characters in files.            意思是, 打印文件中可打印的字符.  我来补充一下吧 ...

  7. TeamCity 创建jar构建步骤

    1 创建工程 2 配置工程代码来源信息 2.1 From a repository URL 表示从代码仓库创建工程. 2.1.1 parent project 指定父工程,默认是root projec ...

  8. jmeter接口/性能压测入门

    1.相关知识 https://www.cnblogs.com/star91/p/5059222.html http://www.51testing.com/zhuanti/jmeter.html 测试 ...

  9. 51nod1268 和为K的组合(DFS)

    1268 和为K的组合  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以 ...

  10. phpstrom 快速定位到当前编辑文件

    方法1(手动定位): 打开所要查找的文件,然后点击上图中红框中的按钮即可快速定位. 方法二(自动定位): Project面板右上角有个准星类的图标,点击后勾选上Autoscorll from Sour ...