這本書確實是學習多核時代採用現代C++編寫多線程程序的好書,下面是學習總結:
第一章 線程安全的對象生命期管理
對象的創建很簡單,但是不要在構造期間泄漏this指針,比如不要在構造函數中註冊任何回調函數,二段式構造有時候是好方法。
對象的銷燬及析構在多線程中太難,一個萬能的解決方案是引入另外一層間接性,比如C++11中的一對神兵利器shared_ptr/week_ptr;
shared_ptr能實現線程安全的對象釋放,但是它本身不是100%線程安全的,如果要多個線程同時讀寫,需要加鎖。
線程安全的Observer分析及解決方案;對象池Factory,使用shared_ptr定製析構功能,以及弱回調解決生命期問題;
RAII(資源獲取即初始化)是C++語言區別於其它所有編程語言的最重要的特性;一個不懂RAII的C++程序員不是一個合格的程序員。
第二章 線程同步精要
四項原則:
首要原則是儘量最低限度的共享對象;
其次是使用高級的併發編程構件:如TaskQueue, Produce-Consumer Queue, CountDownLatch;
底層同步原語只使用非遞歸的互斥器和條件變量,慎用讀寫鎖,不要用信號量;
除了使用atomic整數之外,不自覺編寫lock-free代碼;
作者的個人原則:
用RAII手法封裝mutex的創建,銷燬,加鎖,解鎖這4個操作;
只用非遞歸的mutex;
不手工調用lock()和unlock()函數;
不使用跨進程的mutex,進程間通信只用TCP sockets;
函數拆分重構,如果一個函數既可能在已經加鎖的情況下調用,又可能在未加鎖的情況下調用,那麼就拆分成兩個函數。
線程安全的Singleton實現,使用pthread_once。
第3章 多線程服務器的適用場合
多線程服務器程序中的線程大致可分爲3類:
IO線程;
計算線程;
第三方庫所用的線程;
BlockingQueue是構建多線程程序的利器;
第4章 C++多線程系統編程精要
C++系統庫的線程安全性,關鍵是規定內存模型。
編寫線程安全程序的一個難點在於線程安全是不可組合的,比如一個函數調用了2個線程安全的函數,結果不一定是線程安全的。
線程的創建比銷燬容易的多,簡單的準則:
程序庫不應該在未提前告知的情況下創建自己的“背景線程”;
儘量用相同的方式創建線程;
在進入main()函數之前不應該啓動線程;
線程的創建最好能在初始化階段全部完成;
線程的銷燬有幾種方式:
自然死亡。這是線程正常退出的方式。
非正常死亡。拋出異常,或者觸發信號等非法操作;
自殺。調用pthread_exit()來退出。
他殺。調用pthread_candel()來強制終止某個線程。
多線程與IO,每個文件描述符只由一個線程操作。
用RAII包裝文件描述符。
RAII與fork,子進程不一定正常工作。fork一般不能在多線程程序中調用。
唯一安全的做法是在fork之後立即調用exec()執行另一個程序,隔斷子進程與父進程的聯繫。