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. VMware卸载有残留,再安装时报错提示MSI Failed

    引用自吾爱破解论坛:https://www.52pojie.cn/thread-455779-1-1.html 解决方法:软件自动清理法: 软件 地址:下载地址1:链接:http://pan.baid ...

  2. mysql----------mysql的一些常用命令

    1.查询一张表中某个字段重复值的记录 select id,cert_number from (select id,cert_number,count(*)as n from 表明 group by c ...

  3. linux----------CentOS的一些除了yum安装以外的基本操作命令。

    1.tail -n 5 文件名字    : 查看大型文件的后五行内容      head -n 5 文件名字 : 查看文件的前五行内容   2.ls -lh          可以查看文件大小转换以后 ...

  4. android sdk 安装 配置

    下载android sdk manager:http://dl.google.com/android/installer_r24.4.1-windows.exe 打开sdk manager 在tool ...

  5. Json常用序列化工具包大比拼

    一.前言 Json已成为计算机编程中最常用的数据传输和存储格式之一,所以对Json的序列化和反序列化工具的选择也是互联网系统中比较重要的环节,尤其在高并发下的执行效率,可能会直接影响系统的吞吐率.本文 ...

  6. 一个spinner控件使用的实例

    布局文件 <?xml version="1.0" encoding="utf-8"?><android.support.constraint. ...

  7. Dynamics CRM On-Premise V9安装手记

    下载地址: https://download.microsoft.com/download/A/D/D/ADDD6898-4EFA-46FA-80B6-6FE9A3CDED63/CRM9.0-Serv ...

  8. Qt3D 5.9 and future

    2017-05 http://blog.qt.io/blog/2017/05/24/qt3d/ Qt3D future 5.9 Use Qt Quick or QPainter to render i ...

  9. Linux下使用acme.sh 配置https 免费证书

    acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...

  10. 根据文字动态计算Label高度或宽度

    //根据已知的label宽度计算文字高度 CGRect rect = [reson boundingRectWithSize:CGSizeMake(label_W, 0) options:NSStri ...