手把手教你寫Linux線程池

線程池
顧名思義,存儲線程的池子。線程池是線程的一種使用模式。在平常業(yè)務(wù)開發(fā)中常規(guī)的邏輯是遇到任務(wù)然后創(chuàng)建線程去執(zhí)行。但是線程的頻繁創(chuàng)建就類似于內(nèi)存的頻繁申請和銷毀,會給操作系統(tǒng)帶來大的壓力,進而影響整體的性能。所以我們一次申請好一定數(shù)量而定線程,然后將線程的管理操作交給線程池,就避免了在短時間內(nèi)不斷創(chuàng)建與銷毀線程的代價,線程池不但能夠保證內(nèi)核的充分利用,還能防止過分調(diào)度,并根據(jù)實際業(yè)務(wù)情況進行修改。
使用線程池的好處
- 任務(wù)到來后立馬就有線程去執(zhí)行任務(wù),節(jié)省了創(chuàng)建線程的時間
- 防止服務(wù)器線程過多導(dǎo)致的系統(tǒng)過載問題
- 相對于進程池,線程池資源占用較少,但是健壯性很差
- 降低資源消耗,通過重用已經(jīng)創(chuàng)建的線程來降低線程創(chuàng)建和銷毀的消耗
- 提高線程的可管理性,線程池可以統(tǒng)一管理、分配、調(diào)優(yōu)和監(jiān)控其中的線程
什么情況下使用線程池
- 需要大量的線程來完成任務(wù),且完成任務(wù)的時間比較短
- 對性能要求苛刻的應(yīng)用
- 接收突發(fā)性的大量請求,但不至于使服務(wù)器因此產(chǎn)生大量線程的應(yīng)用
線程不是越多越好
線程的越多,可能會導(dǎo)致線程切換越頻繁, 進而還有可能導(dǎo)致程序運行效率降低。多線程程序的運行效率, 是一個正態(tài)分布的結(jié)果, 線程數(shù)量從1開始增加, 隨著線程數(shù)量的增加, 程序的運行效率逐漸變高, 直到線程數(shù)量達到一個臨界值, 再次增加線程數(shù)量時, 程序的運行效率會減小(主要是由于頻繁的線程切換影響線程運行效率)。
- 線程若不限制數(shù)量的創(chuàng)建,線程創(chuàng)建過多,資源耗盡,有程序崩潰的風(fēng)險
- 處理一個短時間任務(wù)時,線程會頻繁創(chuàng)建和銷毀,占用系統(tǒng)資源,降低系統(tǒng)性能
Linux如何實現(xiàn)一個線程池
- 每個任務(wù)在放入任務(wù)隊列時設(shè)置好需要處理的數(shù)據(jù)和處理函數(shù)
- 線程池中的線程負責(zé)從任務(wù)隊列當中獲取任務(wù),并進行處理

6. 代碼實現(xiàn)過程
- 創(chuàng)建一個任務(wù)類CTask,可以設(shè)置處理任務(wù)的回調(diào)func以及需要處理的數(shù)據(jù)m_data
- 創(chuàng)建一個線程池類CThreadPool,成員變量有設(shè)置線程池中線程的最大數(shù)量thr_max,任務(wù)緩沖隊列m_queue,互斥量m_mutex,用于實現(xiàn)對緩沖隊列的安全性,條件變量m_cond,用于實現(xiàn)線程池中線程的同步
7.運行結(jié)果
- 10個任務(wù)被5個線程分別處理完

8.小結(jié)
至此,一個簡單的線程池實例就完成了。實際工作中我們可以根據(jù)實際的業(yè)務(wù)量來初始化線程池中線程的個數(shù),并根據(jù)任務(wù)量的多少動態(tài)的增加或減少線程池中的線程。好了,現(xiàn)在讓我們行動起來吧,自己編寫一個線程池。
如果需要線程池源碼,關(guān)注Linux兵工廠,回復(fù)1024獲取,并有大量Linux硬核學(xué)習(xí)資料贈送。