2011-08-30 49 views
0

所以我有一個線程池允許動態調整大小和使用任務範例。我想知道 - 當人們得到這樣的東西時,他們會不再手工創建線程,而只是始終使用任務?那麼,在我的類中使用線程池/任務執行程序來創建線程是否很常見?所以我給自己一個線程池任務管理器系統。我應該從現在開始只使用它來創建所有線程嗎?


mythread pool基於boost::asio::io_serviceboost::packaged_task。它的工作原理是隻有頭,具有升壓1.47.0所有你需要爲它工作是timermy costume thread_groupthread_pool類。開發這樣一個小東西是相當有趣的,但現在我站在一個兩難的境地。

我的任務結構是這樣的:

boost::shared_ptr< boost::packaged_task<int> > task(new boost::packaged_task<int>(boost::bind(calculate_the_answer_to_life_the_universe_and_everything, argument_int_value ))); 

這是挺了過來頭的情況下,當我想創建一個函數,將更新的任何回報,將不得不再次在它的一些運行定時器(例如文件索引器需要檢查每5秒,如果用戶已經創建任何新的文件中某個文件夾)

所以我就可以:

void infinite_thread() 
{ 
    while(true) 
    { 
    timerForCaptureFame.restart(); 
    do_stuff(); 
    spendedTimeForCaptureFame = (int64_t)timerForCaptureFame.elapsed(); 
    if (spendedTimeForCaptureFame < desiredTimeForCaptureFame) 
     boost::this_thread::sleep(boost::posix_time::milliseconds(desiredTimeForCaptureFame - spendedTimeForCaptureFame)); 
    } 
} 

,我會簡單地創建這wraper與代碼的新線程像

boost::thread workerThread(infinite_thread); 

但現在我可以有任務,所以它可能之後的一小段時間變成

boost::shared_ptr< boost::packaged_task<void> > task(new boost::packaged_task<void>(infinite_thread)); 
task_manager->post<void>(task); 

我的任務管理器將獲得該線程不會關閉本身並且通常會添加新的執行線程以保持這個工作。

所以我真的不知道是否有一個thread_pool/task_pool只用於線程創建的線程(例如每個類),或者人們將任務與「純」線程混合在一起嗎?

回答

3

沒有明確的答案。可能有些東西似乎更適合於普通線程,並且不適合任務範例,例如需要持續整個程序持續時間的線程,或者可能超過線程池的線程。如果它永遠不會被帶回游泳池,那麼你可以把它作爲一個單獨的東西來處理。

話又說回來,既然你已經有了線程池,你可能只想所有線程是任務即使是無限長的任務......但law of the instrument的提防。看起來每個工作都是你的新游泳池/金錘子的任務/釘子。

相關問題