十三、執行緒池
阿新 • • 發佈:2021-09-17
虛假喚醒:
當 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個之內;
心之所願,永不相忘