天天看點

簡單的線程池(七)

本文中,筆者為 《簡單的線程池(四)》 提及的非阻塞獨占式線程池增加了一項功能:當某個工作線程的任務隊列中無工作任務時,此工作線程可以去其他工作線程的任務隊列中擷取任務。筆者稱之為非阻塞互助式線程池。

簡單的線程池(七)

筆者對比了測試結果與 《簡單的線程池(六)》 的資料,得出了添加功能前後的差異。

本文不再贅訴與 《簡單的線程池(四)》 相同的内容。如有不明之處,請參考該部落格。

以下代碼給出了此線程池的實作,(lockwise_mutual_pool.h)

此線程池的代碼與 非阻塞獨占式線程池 相比,僅在工作線程的初始函數 Thread_Pool::work(unsigned) 上有差別。當某個工作線程的任務隊列中無工作任務時(#1),此工作線程會去其他工作線程的任務隊列中擷取任務。這裡涉及到的“選擇其他工作線程的任務隊列的算法”(#2),來自于本文最後的參考書籍。

此線程池的結構和與 《簡單的線程池(四)》 中的一緻,此處略。

此線程池使用者送出任務與工作線程執行任務的并發過程與 《簡單的線程池(一)》 中的一緻,此處略。

驗證過程采用了 《簡單的線程池(三)》 中定義的的測試用例。筆者對比了測試結果與 《簡單的線程池(六)》 的資料,結果如下,

圖1 列舉了 吞吐量1的差異 在 0.5 分鐘、1 分鐘和 3 分鐘的送出周期内不同思考時間上的對比。

簡單的線程池(七)

圖1

【注】非阻塞互助式 略稱為 LM ,下同。

可以看到,

當思考時間為 0 時,LM 的吞吐量優于 LS、BS 的吞吐量,相當于 LU、BU 的吞吐量;延長送出周期後,LM 和 LS、BS、LU、BU 的吞吐量差異沒有發生明顯變化;

當思考時間不為 0 時,LM 的吞吐量大幅優于 LS、LU 的吞吐量,大幅劣于 BS、BU 的吞吐量,但差異不會因送出周期的延長而大幅變化;随着思考時間的增加,LM 的吞吐量與 LS、BS、LU、BU 的吞吐量差異逐漸消失。

圖2 列舉了 吞吐量2的差異 在 0.5 分鐘、1 分鐘和 3 分鐘的送出周期内不同思考時間上的對比。

簡單的線程池(七)

圖2

當思考時間為 0 時,LM 的吞吐量優于 LS、BS、LU、BU 的吞吐量;延長送出周期後,LM 和 LS、BS、LU、BU 的吞吐量差異沒有發生明顯變化;

當思考時間不為 0 時,因 LM 和 LS、BS、LU、BU 的吞吐量均為 0,它們間沒有差異。

圖3 列舉了 吞吐量3的差異 在 0.5 分鐘、1 分鐘和 3 分鐘的送出周期内不同思考時間上的對比。

簡單的線程池(七)

圖3

當思考時間為 0 時,LM 的吞吐量相當于 LS、BS、LU 的吞吐量,略劣于 BU 的吞吐量;延長送出周期後,LM 和 LS、BS、LU、BU 的吞吐量差異沒有發生明顯變化;

基于以上的對比分析,筆者認為,在非阻塞式線程池中,

互助式的吞吐量名額優于共享式、獨占式的吞吐量名額。

完整的示例代碼和測試結果請參考 [github] cnblogs/15710614 。

關于“選擇其他工作線程的任務隊列的算法”,筆者參考了 C++并發程式設計實戰 / (美)威廉姆斯 (Williams, A.) 著; 周全等譯. - 北京: 人民郵電出版社, 2015.6 (2016.4重印) 一書。緻 Anthony Williams、周全等譯者。

受限于作者的水準,讀者如發現有任何錯誤或有疑問之處,請追加評論或發郵件聯系 [email protected]。作者将在收到意見後的第一時間裡予以回複。 本文來自部落格園,作者:green-cnblogs,轉載請注明原文連結:https://www.cnblogs.com/green-cnblogs/p/15710614.html 謝謝!

繼續閱讀