Linux多線程服務器編程(陳碩)學習總結

這本書確實是學習多核時代採用現代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()執行另一個程序,隔斷子進程與父進程的聯繫。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章