读书笔记——《C++ Concurrency IN ACTION》
=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:http://www.cnblogs.com/wlsandwho/p/8011173.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
一直以来都是在Windows上用VS做开发。由于不考虑移植性,所以对于多线程编程之类的高级玩意儿,都是使用系统API做的。
为了适应时代的发展潮流,觉得还是搞搞C++原生的比较好,虽然原生的比较有点特别废柴。
在看这本书之前,我也仔细看了《C++标准库(第2版)》的部分内容。现在再看这本,深入一下。
=======================================================================
这篇博客作为读书笔记,查漏补缺。持续更新。当然,只写自己关心的东西。顺(zhǔ)便(yào)也(shì)吐下槽。
=======================================================================
第1、2、3章有点基础的话,没有看的必要。
=======================================================================
书本Page “转移线程所有权” (书中有时候只举错误例子,但是不给出正确做法。这里我修改下。)
#include "stdafx.h" #include <thread> void Do1()
{
std::this_thread::sleep_for(std::chrono::minutes());
} void Do2()
{
std::this_thread::sleep_for(std::chrono::minutes());
} int main()
{
//Page23 转移线程的所有权
// std::thread t1(Do1);
// std::thread t2 = std::move(t1);
//
// std::thread t3;
// t3 = std::move(t2);
//
// t1 = std::thread(Do2);
// t1 = std::move(t3); std::thread t1(Do1);
std::thread t2 = std::move(t1); std::thread t3;
t3 = std::move(t2); t1 = std::thread(Do2);
if (t1.joinable())
{
t1.join(); //t1.detach();//两者都可
}
t1 = std::move(t3);
if (t1.joinable())
{
t1.join();
} return ;
}
=======================================================================
书本Page44提到了锁的粒度问题。这个问题,必须具体问题具体分析,根据实际的情况/抽象模型,挑选最适合的。
=======================================================================
书本Page57提到了std::once_flag和std::call_once,其实如果合理的设计一下功能和结构,是不会用到这个的。同理Page58上的C++11的局部static变量
=======================================================================
书本Page60,“保护很少更新的数据结构”中用到的东西,C++11没有提供而使用的BOOST,这一目的同样可以由API的SRW锁来实现。
我相信速度不会比原生C++差。
=======================================================================
书本Page61,“递归锁”这一小节,我不推荐使用。如果需要用到这个,说明设计上所稍有点问题。与其越挖越深,不如重做一下。
=======================================================================
书本Page66,解释了使用unique_lock的原因。其实万一忘了需要使用什么类型,condition_ariable的wait函数也是指明了需要什么数据类型的。哈哈哈。
=======================================================================
书本Page43和书本Page70,前一个没有解释mutable,后一个说的也不清楚。
问题的引出是
bool empty() const
{
std::lock_guard<std::mutex> lk(mut);
return date_queue.empty();
}
我们知道,由const修饰的成员函数,是不会修改对象的。
那么,当我们需要访问队列时,就需要给队列上锁,以便互斥操作。
但是上锁是会修改锁的,恰好这个锁是属于对象的。
所以要做特殊处理,噔噔噔噔~,mutable登场。
=======================================================================
Page72,future一旦就绪,就无法复位,是一次性的。
=======================================================================
读书笔记——《C++ Concurrency IN ACTION》的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- 我 对jvm 创建线程的一些了解
1.jvm 每创建一个线程都会对应产生一个该线程的虚拟机栈,栈大小通过-Xss参数来设置,JDK1.5之后默认为1M 2.JVM创建线程需要内存,但这部分内存不使用堆内存(毕竟JVM虚拟机栈).对于3 ...
- Augustus安装小记
之前安装过一次Augustus,由于节点重新部署后,原来安装的硬盘被格掉了,今天重新安装的时候出了一些问题,记录一下. 1. 需要boost,安装好boost之后,虽然将其加入到~/.bashrc配置 ...
- 微信小程序开发之scroll-view
本文主要介绍通过scroll-view实现回至顶部,如下效果 一.页面代码 顶部的工具栏放一个查找按钮,滚动区域实现分页,目的就是为了点击上一页\下一页时,自动回到顶部. scroll-view必须指 ...
- ContentResolver,ContentProvider,ContentObserver使用记录
版权声明:本文出自汪磊的博客,转载请务必注明出处. 本篇博客只是记录一下ContentProvider的使用(这部分工作中用的比较少总是忘记),没有太深入研究.已经熟练掌握使用方式,想深入了解内部机制 ...
- JavaScript 遍历多维数组
基于ECMAScript5提供遍历数组的forEach方法仅能遍历一维数组,没有提供循环遍历多维数组的方法,所以根据白鹤翔老师的讲解,实现如下遍历多维数组的each方法,以此遍历多维数组. <s ...
- Java第一章----Java概述+环境搭建
写在前面的话: Java基础的东西看过好几遍,但是过一段都就忘记了,所以这次我决定花费一些时间整理一个系列博客供以后方便查阅.此系列根据Java编程思想+Java核心技术两本书整理而来,这两本书也是我 ...
- C#对象深度克隆
有基础的开发者都应该很明白,对象是一个引用类型,例如: object b=new object(); object a=b; 那么a指向的是b的地址,这样在有些时候就会造成如果修改a的值,那么b的值也 ...
- 关于FPGA的一些你必须知道的概念
前仿真也称为功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致.可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与T ...
- SSIS 延迟验证(DelayValidation)
验证是一个事件,该事件在Package执行时,第一个被触发,验证能够避免SSIS引擎执行一个有异常的Package或Task.延迟验证(DelayValidation)是把验证操作延迟到Package ...
- vue 购物车练习
本人看了vue官网上的教程后,感觉对vue的依稀有点了解,决定动手练习个小功能项目,就找了购物车本项目.原文链接:http://blog.csdn.net/take_dream_as_horse/ar ...