C++ Concurrency in Action 读书笔记一:thread的管理
为避免混淆,用thread表示
std::thread及其对象实例,用线程表示操作系统概念下的线程
Chapter 2 thread的管理
2.1 thread的创建(构造函数)
a. 默认构造函数
default: thread() noexcept;
创建一个placeholder,不和任何线程关联。其使用场景如定义一个thread数组。可以在之后通过thread& operator=( thread&& other ) noexcept来赋予值以和线程关联
b. Move构造函数
thread (thread&& other) noexcept;
c. 初始化构造函数
template<class Function, class...Args>
explicit thread(Function&& f, Args&&...args);
常用的构造函数,在创建对象的时候传入function及其参数,从而和线程关联
d. 拷贝构造函数
thread(const thread&) = delete;
thread对象不可拷贝
2.2 join:等待线程执行完成
join也会清理和线程有关的所有内存。join返回后thread不再与任何线程关联,joinable()将返回false。每个线程只能调用一次join
异常可能使程序在join被调用前结束,为了避免这种情况,需要在catch中也调用join。但 try-catch 的方式过于繁琐,而且会打乱作用域。因此如果确实有要保证在所有退出路径均join的需求,可以采用 RAII 机制,封装一个 thread_guard 类,在其析构函数中处理
2.3 detach:后台线程
对thread对象调用detach将使与之关联的线程在后台运行,且断绝了任何能与之通信的手段,无法再通过thread对象来引用它,也因此无法被join
被 detach 的线程又叫做 daemon 线程
thread对象是否可被 detach 和其是否可以 join需满足相同的条件:必须有线程与之关联,体现在joinable()必须返回true
2.4 thread参数传递
构造thread对象时在传入 callable 之后紧接着传入其所需参数
参数被拷贝到可以被新创建的线程访问到的内部存储中,然后作为右值传给 callable,如同临时变量一样
如果传参以来隐式转型,则结果可能并非所料。如参数为string const&,传入的为char buff[LEN]时,虽然看起来是buf会隐式转型为string const,然后再传给 callable,但实际上传参时是 as is,即不加处理、先将传入的参数(此处是 buf(指针/数组名))拷贝到内部存储,此时若thread对象被detach,则buf指向的存储空间被清理,而此时 callable 的参数可能未来得及构造出来,从而会出现未定义的行为
直接传 non-const reference 的话会编译出错,因为构造函数接受的参数类型为右值,如果想传引用,需用std::ref
如果参数类型不能被拷贝只能被 move,则传参后控制权会转移
2.5 thread ownership的转移
thread对象实例可以被 move,可以被 move 构造
不可 move 给已经同线程关联的thread
2.6 std::thread::hardware_concurrency():一般为CPU核数,但只是 hint 值,也可能为0
2.7 thread的标识
线程标识类型:std::thread::id,可进行比较,可哈希,但其值没有语义涵义(无意义)
调用thread对象实例的get_id()方法获取 id。若未与线程相关联,则返回默认构造的 id,表示 not any thread
当前线程的 id 可以通过std::this_thread::get_id()获取 id
C++ Concurrency in Action 读书笔记一:thread的管理的更多相关文章
- Java Concurrency in Practice 读书笔记 第十章
粗略看完<Java Concurrency in Practice>这部书,确实是多线程/并发编程的一本好书.里面对各种并发的技术解释得比较透彻,虽然是面向Java的,但很多概念在其他语言 ...
- AngularJS in Action读书笔记6(实战篇)——bug hunting
这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...
- 《深入分析Java Web技术内幕》读书笔记之JVM内存管理
今天看JVM的过程中收获颇丰,但一想到这些学习心得将来可能被遗忘,便一阵恐慌,自觉得以后要开始坚持做读书笔记了. 操作系统层面的内存管理 物理内存是一切内存管理的基础,Java中使用的内存和应用程序的 ...
- Java Concurrency in Practice——读书笔记
Thread Safety线程安全 线程安全编码的核心,就是管理对状态(state)的访问,尤其是对(共享shared.可变mutable)状态的访问. shared:指可以被多个线程访问的变量 mu ...
- AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
个人感觉<Angularjs in action>这本书写的很好,很流畅,循序渐进,深入浅出,关键是结合了一个托管于Github上的实例讲解的,有代码可查,对于初学者应该是个不错的途径.( ...
- AngularJS in Action读书笔记2——view和controller的那些事儿
今天我们来818<angularjs in action>的第三章controller和view. 1.Big Picture概览图 View是angularjs编译html后呈现出来的, ...
- AngularJS in Action读书笔记1——扫平一揽子专业术语
前(fei)言(hua): 数月前,以一个盲人摸象的姿态看了一些关于AngularJS的视频书籍,留下了我个人的一点或许是指点迷津或许是误人子弟的读后感.自以为已经达到熟悉ng的程度,但是因为刚入公司 ...
- java concurrency in practice读书笔记---ThreadLocal原理
ThreadLocal这个类很强大,用处十分广泛,可以解决多线程之间共享变量问题,那么ThreadLocal的原理是什么样呢?源代码最能说明问题! public class ThreadLocal&l ...
- R in Action 读书笔记(6)基本图形
MindMapper原文件
- R in Action 读书笔记(5)
MindMapper原文件
随机推荐
- JS leetcode x 的平方根 题解分析
壹 ❀ 引 这几天心情复杂,也不知道形容.做道题吧,其实是上周的题,一直没整理,比较巧的是,这也是我同学17年去PPTV面试时遇到的一题,题目来自leetcode69. x 的平方根,题目描述如下: ...
- mysql 8.0 配置文件my.cnf中文注解【转载】
########################################################################### ## my.cnf for MySQL 8.0. ...
- Js文件异步加载
Js文件异步加载 浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速 ...
- New Questions
1. C++/Qt 实现一个信号槽 #include <functional> #include <iostream> #include <vector> clas ...
- vs 工程中替换 Qt 静态库
上篇介绍了如何编译 Qt 静态库 编译 windows 上的 qt 静态库 这篇介绍如何替换已有的 Qt 静态库,比如 Qt5.15.0 有很多 bug,我们不得不提升 Qt 版本来避免 bug 导致 ...
- 硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析
前言 前面输出了HDMI,LVDS,MIPI-DSI,这里还有一个常用的显示接口就是VGA了,这个用的不多了,一般板子都是hdmi了. 本篇分析底板VGA电路. VGA接口 VGA(Vi ...
- Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
前言 在ubuntu上arm交叉编译MPlayer播放器,并部署到开发板播放音乐. Demo Mplayer MPlayer是一款开源多媒体播放器,以GNU通 ...
- python中partial用法
应用 典型的,函数在执行时,要带上所有必要的参数进行调用.然后,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 示例pyqt5 ...
- JS内存爆破问题
原理 检测到调试,格式化等,疯狂的在js文件,或者html中进行读写,cookie重写追加,字节追加,导致内存不足够,卡死 内存爆破,指js通过死循环/频繁操作数据库(包括cookie)/频繁调取hi ...
- 【Azure Spring Cloud】部署Azure spring cloud 失败
问题描述 使用Azure CLI指令部署Azure Spring Cloud项目失败,错误消息提示没有安装"azure.storage.blob"模块 问题分析 根据错误提示,是p ...