2012-07-27 85 views
0

boost::thread不-一個線程,當ftor傳遞給它被調用,線程退出時ftor回報創建new thread如何使升壓線程池::線程

我們使用線程池來最小化線程創建和銷燬成本。但是當提供的ftor返回時,線程池中的每個線程也會被破壞。

那麼構建線程池後面的基本概念是什麼?是否有任何永久線程,我可以分配ftors到該線程?

+0

'ftor'?你的意思是functor?請在下次拼寫出來。 – GManNickG 2012-07-27 05:51:17

+0

是functor ...... – 2012-07-27 06:01:10

+0

看看http://stackoverflow.com/questions/4084777/creating-a-thread-pool-using-boost – ForEveR 2012-07-27 06:06:12

回答

1

線程池只是一堆已經運行的線程,並且都運行相同的函數。這個函數基本上只是等待一個隊列,當隊列中有一個「函數」時,它會提取並執行它。

僞代碼:

void thread_pool_function() 
{ 
    while (true) 
    { 
     wait_for_signal_that_queue_is_not_empty(); 

     function_to_call = queue.remove_top(); 

     unklock_queue_semaphore(); 

     function_to_call(); 
    } 
} 

create_thread(thread_pool_function); 
create_thread(thread_pool_function); 
create_thread(thread_pool_function); 
create_thread(thread_pool_function); 

在「碼」上現在有四個線程,最初都在等待着什麼被放在一個「排隊」。當隊列中有東西時,它會提取它,並將其作爲函數調用。

這可能是實現線程池的最簡單方法。

+0

實際上我只需要'threadpool.tryStart(f)'而不是'start'例如我不需要排隊。因爲隊列可以無限長,因爲我的存款利率遠遠高於執行率。另一方面,由於存款利率太高,它最終將作爲投票工作。那麼維護隊列是否是正確的決定? (我在另一個線程中運行的'f'是一個Image比較器,我總是可以做一個代理回調,這個代理回調可以讓我控制是否將相同的回調多次放入隊列中,但仍然可以,沒有一個隊列是正確的決定?) – 2012-07-27 07:38:33

+0

+1我使用這樣的顯式線程池很多,用多種語言。它比現代語言中的某些「內置」線程池實現提供了更好的控制,其中一些似乎做出了關於何時添加額外線程的不適當決定。 – 2012-07-27 10:37:37

1

在addtion什麼@Joachim發佈:

的一種方式,以流量控制這樣的系統(和一個我用了很多),是使用「池隊列」(阻止生產者 - 消費者隊列) ,在啓動時創建和填充任務數量固定的任務。任何想要發佈任務的線程都必須先從池中獲取一個線程,並在完成處理後將任務返回到池中。這限制了系統中的任務數量,並且如果池清空,請求線程只需等待,在空池中被阻塞,直到某些「已使用」任務回來。

這很好,控制,防止內存失控並消除創建/銷燬的連續任務。在定時器上週期性地顯示/寫入池隊列深度也很容易,所以你可以看到你的應用程序是如何「繁忙」的(並且檢測到任何泄漏:)。

編輯:另外,它不需要系統中的任何有界隊列。無界隊列更簡單,往往需要更少的系統調用。