1. 程式人生 > 其它 >十三、執行緒池

十三、執行緒池

虛假喚醒:

當 wait() 不帶有第二個判斷條件引數時會發生虛假喚醒的情況,所以wait()中儘量要帶有第二個引數,並且這個lambda表示式要正確判斷處理的公共資料是否存在。條件變數很重要,以後會經常用到。

atomic:

std::atomic<int> atm = 0;
 
cout << atm << endl;

這裡只有讀取atm是原子操作,但是整個cout << atm << endl; 並不是原子操作。

  比如說,atm是2000了,但是輸出的還atm=1902的值。

std::atomic<int> atm = 0
; auto atm2 = atm; //不是原子操作

原子變數的賦值:禁用了拷貝建構函式,

load():以原子方式讀atomic物件的值,以store方式寫入atomic

atomic<int> atm2(atm.load());

原子操作實質上是:不允許CPU在進行原子物件操作時進行上下文切換。

淺談執行緒池:

場景設想:伺服器程式, 每來一個客戶端,就建立一個新執行緒為這個客戶提供服務。

問題:

1、2萬個玩家,不可能給每個玩家建立一個新執行緒,此程式寫法在這種場景下不通。

2、程式穩定性問題:編寫程式碼中,偶爾建立一個執行緒,這種寫法,讓人感到不安,有時候資源緊張會建立失敗;

執行緒池:把一堆執行緒弄到一起,統一管理。這種統一管理排程,迴圈利用的方式,就叫做執行緒池。

實現方式:程式啟動時,一次性建立好一定數量的執行緒。10(第十一個來了就先等待),8,100-200。這種方式讓人更放心,覺得程式程式碼更穩定。

執行緒建立數量談:

1、執行緒建立的數量極限的問題

一般來講,2000個執行緒基本就是極限;在建立就會崩潰。

2、執行緒建立數量建議

a、採用某些計數開發程式:採用api介面商提供建議,遵照建議和指示來確保程式高效執行。

b、建立多執行緒完成業務;一個執行緒等於一條執行通路;

c、執行緒建立數量儘量不要超過500個,儘量控制在200個之內;

心之所願,永不相忘