读书笔记——《C++ Concurrency IN ACTION》

时间:2022-05-05 09:55:52

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

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

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

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