=================================版权声明=================================

版权声明:原创文章 禁止转载 

请通过右侧公告中的“联系邮箱(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一旦就绪,就无法复位,是一次性的。

=======================================================================