讀書筆記——《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一旦就緒,就無法復位,是一次性的。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM