=================================版權聲明=================================
版權聲明:原創文章 禁止轉載
請通過右側公告中的“聯系郵箱(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一旦就緒,就無法復位,是一次性的。
=======================================================================