a) 建立 Work class, 将arg設定為 Work*, Work由使用者建立,使用者删除,線程池内僅保留對Work對象的引用
問題:我寫完thread_pool後才發現,使用者不再知道如何去删除他建立的
Work了,因為線程池内儲存着指向Work的指針,線程池是自動析構的,是以,這種設計方法不可行
b) 設計方法和 a 一緻,唯一的不同是線程池内複制了Work, 在類内,直接使用Work對象,不再使用指針了
問題:對于每一個局部變量都需要建立一個Work對象,假如使用者數足夠多的話,這是很耗時的。我寫過的程式告訴我,盡量少的使用局部變量
c) 讓使用者建立 shared_ptr 類型的Work
問題:對于client來講,太複雜了
最終方案:
schedule設定三個接口,一個接口符合Posix的線程調用習慣,直接使用 schedule(void(*func)(void*),
(void*))。另一個接口使用 schedule(Work*), 最後一個接口schedule(Work)
線程池内部使用shared_ptr包含Work。
shutdown() 訓示線程池不再接受新的任務
shutdownNow() 訓示線程池喚醒所有的等待線程并對所有的線程執行 interrupt() 函數
線程池的析構函數和shutdown()類似,喚醒等待的線程(線程隻有在工作隊列為空的情況下才會去等待),并等待所有running的程序結束。析構函數不需要析構資料結構,因為資料結構都設定為
shared_ptr的。
boost::thread
的啟動函數隻能線上程初始化時賦予,中途不得更改(沒有這種接口),是以,線程池在初始化時讓所有的工作線程進行無限循環等待任務,在循環體内接受shutdown()
或 shutdownNow() 任務