《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
《c++ concurrency in action》读书笔记1的更多相关文章
- 《Linux/Unix系统编程手册》读书笔记 目录
<Linux/Unix系统编程手册>读书笔记1 (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2 (创建于4月9日,最后更新4月10日) ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
- 《Linux/Unix系统编程手册》读书笔记6
<Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...
- 《Linux/Unix系统编程手册》读书笔记5
<Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...
- 《Linux/Unix系统编程手册》读书笔记4
<Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...
- 《Linux/Unix系统编程手册》读书笔记3
<Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...
- 《Linux/Unix系统编程手册》读书笔记1
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...
- 《Linux/Unix系统编程手册》读书笔记2
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
随机推荐
- VMware卸载有残留,再安装时报错提示MSI Failed
引用自吾爱破解论坛:https://www.52pojie.cn/thread-455779-1-1.html 解决方法:软件自动清理法: 软件 地址:下载地址1:链接:http://pan.baid ...
- mysql----------mysql的一些常用命令
1.查询一张表中某个字段重复值的记录 select id,cert_number from (select id,cert_number,count(*)as n from 表明 group by c ...
- linux----------CentOS的一些除了yum安装以外的基本操作命令。
1.tail -n 5 文件名字 : 查看大型文件的后五行内容 head -n 5 文件名字 : 查看文件的前五行内容 2.ls -lh 可以查看文件大小转换以后 ...
- android sdk 安装 配置
下载android sdk manager:http://dl.google.com/android/installer_r24.4.1-windows.exe 打开sdk manager 在tool ...
- Json常用序列化工具包大比拼
一.前言 Json已成为计算机编程中最常用的数据传输和存储格式之一,所以对Json的序列化和反序列化工具的选择也是互联网系统中比较重要的环节,尤其在高并发下的执行效率,可能会直接影响系统的吞吐率.本文 ...
- 一个spinner控件使用的实例
布局文件 <?xml version="1.0" encoding="utf-8"?><android.support.constraint. ...
- Dynamics CRM On-Premise V9安装手记
下载地址: https://download.microsoft.com/download/A/D/D/ADDD6898-4EFA-46FA-80B6-6FE9A3CDED63/CRM9.0-Serv ...
- 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 ...
- Linux下使用acme.sh 配置https 免费证书
acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...
- 根据文字动态计算Label高度或宽度
//根据已知的label宽度计算文字高度 CGRect rect = [reson boundingRectWithSize:CGSizeMake(label_W, 0) options:NSStri ...