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原文件
随机推荐
- 从零开始的 dbt 入门教程 (dbt core 开发进阶篇)
引 在上一篇文章中,我们花了专门的篇幅介绍了 dbt 更多实用的命令,那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念,如果你是 dbt 初学者,我相信如下知识点一定会对你有 ...
- JS leetcode 猜数字 题解分析,我以为题目在第八层我在第一层,其实我在第三层题目在第一层
壹 ❀ 引 今天来做一道简单到让我一度怀疑题目本意的题目,题目来自leetcode LCP 01. 猜数字,题目描述如下: 小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小 ...
- 适用于Spring Boot Jar的启停部署脚本
shell脚本参数 使用-z或-n对一个变量判空时, 若直接使用[ -n ARG ]这种形式,当{ARG}中有空格将会报错, line 27: [: sd: binary operator expec ...
- 【Unity3D】流动雾效
1 前言 屏幕深度和法线纹理简介中对深度和法线纹理的来源.使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将介绍使用深度纹理重构屏幕像素点在相机坐标系下的坐标计 ...
- 【Unity3D】固定管线着色器二
1 前言 固定管线着色器一 中介绍了 Shader 中外部属性.光照.贴图等基础用法,本文将进一步讲解固定管线着色器,介绍正面与反面剔除.Alpha 测试.深度测试.混合.渲染队列等用法.渲染管线 ...
- Maven多模块聚合工程实战
介绍 本文以SpringCloud微服务多模块聚合案例讲解,全程讲解中间涉及的核心知识点并配图加深理解. 更多maven知识点,建议去看<Maven实战>. 创建父工程 新建maven工程 ...
- java利用hdfs api进行上传下载操作
1.说明 最近项目中一部分大文件需要存储到hadoop的hdfs组件中,自己本地用3台centos7虚拟机搭建了一套集群.本地写点java代码测试一下. 代码部分改编自网络. 环境说明 一主二仆结构. ...
- Linux crontab不执行
Linux 系统里面计划任务,crontab 没有如期执行这是运维工作中比较常见的一种故障了. 下面结合最近部署自动脚本不执行问题排查步骤: 1.检查 crontab 服务是否正常 [dmdba@te ...
- SSL/TLS 资料整理
1. HTTPS详解二:SSL / TLS 工作原理和详细握手过程 看到另外几篇介绍不错的文章,再次分享一下 园内大佬写的, 通过一个小故事,理解 HTTPS 工作原理 这篇博文已经把 SSL 的工作 ...
- android 逆向笔记
壳检测工具 GDA 2. 逆向分析APP 一般流程 1. 使用自动化检测工具检测APP是否加壳,或者借助一些反编译工具依靠经验判断是否加壳 2. 如果apk加壳,则需要先对apk进行脱壳 3. 使用` ...