=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(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 “转移线程所有权” (书中有时候只举错误例子,但是不给出正确做法。这里我修改下。)
1 #include "stdafx.h" 2 3 #include <thread> 4 5 void Do1() 6 { 7 std::this_thread::sleep_for(std::chrono::minutes(1)); 8 } 9 10 void Do2() 11 { 12 std::this_thread::sleep_for(std::chrono::minutes(2)); 13 } 14 15 int main() 16 { 17 //Page23 转移线程的所有权 18 // std::thread t1(Do1); 19 // std::thread t2 = std::move(t1); 20 // 21 // std::thread t3; 22 // t3 = std::move(t2); 23 // 24 // t1 = std::thread(Do2); 25 // t1 = std::move(t3); 26 27 std::thread t1(Do1); 28 std::thread t2 = std::move(t1); 29 30 std::thread t3; 31 t3 = std::move(t2); 32 33 t1 = std::thread(Do2); 34 if (t1.joinable()) 35 { 36 t1.join(); //t1.detach();//两者都可 37 } 38 t1 = std::move(t3); 39 if (t1.joinable()) 40 { 41 t1.join(); 42 } 43 44 return 0; 45 }
=======================================================================
书本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,后一个说的也不清楚。
问题的引出是
1 bool empty() const 2 { 3 std::lock_guard<std::mutex> lk(mut); 4 return date_queue.empty(); 5 }
我们知道,由const修饰的成员函数,是不会修改对象的。
那么,当我们需要访问队列时,就需要给队列上锁,以便互斥操作。
但是上锁是会修改锁的,恰好这个锁是属于对象的。
所以要做特殊处理,噔噔噔噔~,mutable登场。
=======================================================================
Page72,future一旦就绪,就无法复位,是一次性的。
=======================================================================