读书笔记——《C++ Concurrency IN ACTION》
2017-12-09 13:07
316 查看
=================================版权声明=================================
[b]版权声明:原创文章 禁止转载
[/b]
请通过右侧公告中的“联系邮箱(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 “转移线程所有权” (书中有时候只举错误例子,但是不给出正确做法。这里我修改下。)
=======================================================================
书本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,后一个说的也不清楚。
问题的引出是
我们知道,由const修饰的成员函数,是不会修改对象的。
那么,当我们需要访问队列时,就需要给队列上锁,以便互斥操作。
但是上锁是会修改锁的,恰好这个锁是属于对象的。
所以要做特殊处理,噔噔噔噔~,mutable登场。
=======================================================================
Page72,future一旦就绪,就无法复位,是一次性的。
=======================================================================
[b]版权声明:原创文章 禁止转载
[/b]
请通过右侧公告中的“联系邮箱(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(1)); } void Do2() { std::this_thread::sleep_for(std::chrono::minutes(2)); } 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 0; }
=======================================================================
书本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》读书笔记二 线程之间共享资源
- C++11 多线程编程《C++ Concurrency in Action》读书笔记(1)-Hello World of Concurrency in C++
- C++11 多线程编程《C++ Concurrency in Action》读书笔记(2)-Managing Threads
- 《C++ Concurrency in Action》读书笔记四 c++内存模型和原子类型
- C++11 多线程编程《C++ Concurrency in Action》读书笔记(3)-Sharing data between Threads
- 《C++ Concurrency in Action》读书笔记一 多线程与线程管理
- 《C++ Concurrency in Action》读书笔记三 同步并发操作
- 《C++ Concurrency in Action》笔记2 线程函数传参(1)
- 《C++ Concurrency in Action》笔记7 mutex(1)
- 《C++ Concurrency in Action》笔记23 std::atomic<bool>
- 《C++ concurrency in action》浅谈double_check
- 《C++ Concurrency in Action》笔记28 无锁并行数据结构
- 《C++ Concurrency in Action》笔记1 join和detach
- 《C++ Concurrency in Action》笔记7 mutex(3)pop和top问题之示例
- 《C++ Concurrency in Action》笔记15 a thread-safe queue with condition variable
- 《C++ Concurrency in Action》笔记7 mutex(2)pop和top问题
- 《C++ Concurrency in Action》笔记8 死锁(1)
- 《C++ Concurrency in Action》笔记18 std::shared_future
- 《C++ Concurrency in Action》笔记31 测试及调试多线程应用程序
- 《C++ concurrency in action》 读书笔记 -- Part 3 第四章 线程的同步