《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更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
随机推荐
- 基于C#的Appium自动化测试框架(Ⅰ):程序结构
因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境[说白了就是因为懒…… 无意中看到了外面的 ...
- CentOS 搭建git服务
git服务器的搭建是非常简单的. 1. 安装git yum install git 2. 创建用户git groupadd git adduser git -g git passwd git 3. 创 ...
- stm32 堆溢出
STM32 堆溢出 遇到的问题 最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃.检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在. 原 ...
- 软件工程实践助教每周小结 < 福州大学 | 傅明建 >
第一周助教小结 1. 助教博客链接: http://www.cnblogs.com/sinceway/ 2. 本周点评的作业数量:约22份,有多次交互 3. 本周点评有困难的作业链接: https:/ ...
- django signals 信号
django signals 信号 配置方式 app下的 __init__.py default_app_config="web.apps.WebConfig" #初始化app配置 ...
- URLConnection类详解-转
转-http://www.cnblogs.com/shijiaqi1066/p/3753224.html 1. URLConnection概述 URLConnection是一个抽象类,表示指向URL指 ...
- 信步漫谈之JDK—源码编译
一.环境 Linux 系统:CentOS_6.5_x86_64 JDK 安装包:jdk-7u80-linux-x64.rpm OpenJDK 源码包:OpenJDK7 下载路径:http://down ...
- vim基本命令总结
编辑模式下i 从光标所在位置前开始插入文本I 将光标移动到当前行行首,然后在其前插入文本a 用于在光标当前所在位置之后追加新文本A 将光标移动到所在行行尾,在那里插入新文本o 在光标所在行的下面新开一 ...
- 第十七节 Cookie基础与应用
什么是cookie:其实就是页面用来保存信息:比如,自动登录.记住用户名 cookie的特性:(以域名为单位的) 同一个网站(同一个域名)中所有页面共享一套cookie 数量.大小有限,跟浏览器有关, ...
- mysql和oracle分页查询
MYSQL分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实现分 ...