C++實現的帶最大最小線程數的線程池(基於ACE)

最近需要一個能根據請求數變化的線程池,JAVA有這樣的東西,可是C++下好像一般只是固定大小的線程池。所以就基於ACE寫了個,只做了初步測試。

主要思想是:

1. 重載ACE_Task,這相當於是個固定線程池,用一個信號量(ACE_Thread_Semaphore)來記數空閒線程數。

2. 初始化時根據用戶的輸入,確定最少線程數minnum和最大線程數maxnum,當多個請求到來,並且無空閒線程(信號量用光),判斷總線程數小於maxnum,就開始強迫增加線程數。

3. 當線程響應完一個請求(任務)後,如果當前任務隊列爲空,且線程數大於minnum,就退出本線程。這裏做了一個優化,就算滿足條件,線程也會在隊列上再等待10秒,防止線程池抖動帶來不必要的開銷。

使用:

重載這個類,重載service_func函數實現自己的任務處理。

start_pool初始化線程池,之後,就可以用add_task向線程池添加任務。

它會根據請求的數量自動控制池大小進行處理。

已經在LINUX下測試通過。由於ACE是跨平臺的,所以這個實現也應該可以在WINDOWS下工作。

編譯:

帶THREAD_POOL_UNIT_TEST選項,則編譯出自測程序test

gcc -g -Wall -O2 -g -Wall -I. -I../ -I../mon/comm/ACE_wrappers -g -DTHREAD_POOL_UNIT_TEST -o test thread_pool.cpp -lpthread -lm -lz -lstdc++ ../mon/comm/ACE_wrappers/ace/libACE.a -ldl

thread_pool.h頭文件:

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章