• 读书笔记——《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 “转移线程所有权” (书中有时候只举错误例子,但是不给出正确做法。这里我修改下。)

     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一旦就绪,就无法复位,是一次性的。

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

  • 相关阅读:
    ruby计算平方和开方
    Silverlight中DataGrid翻页或者滚动时CheckBox/RadioButton显示的问题
    bat文件设置ip地址
    gcc编译多线程
    TCP Nagle算法
    fork父子进程 信号处理
    Unix守护进程的创建示例
    inline内联函数
    volatile类型
    ioctl获取接口名称、IP地址、MAC地址、广播地址等
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/8011173.html
Copyright © 2020-2023  润新知