最近需要一個能根據請求數變化的線程池,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頭文件: