boost::thread
是不-一個線程,當ftor
傳遞給它被調用,線程退出時ftor
回報創建new thread
。如何使升壓線程池::線程
我們使用線程池來最小化線程創建和銷燬成本。但是當提供的ftor返回時,線程池中的每個線程也會被破壞。
那麼構建線程池後面的基本概念是什麼?是否有任何永久線程,我可以分配ftors到該線程?
boost::thread
是不-一個線程,當ftor
傳遞給它被調用,線程退出時ftor
回報創建new thread
。如何使升壓線程池::線程
我們使用線程池來最小化線程創建和銷燬成本。但是當提供的ftor返回時,線程池中的每個線程也會被破壞。
那麼構建線程池後面的基本概念是什麼?是否有任何永久線程,我可以分配ftors到該線程?
線程池只是一堆已經運行的線程,並且都運行相同的函數。這個函數基本上只是等待一個隊列,當隊列中有一個「函數」時,它會提取並執行它。
僞代碼:
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);
在「碼」上現在有四個線程,最初都在等待着什麼被放在一個「排隊」。當隊列中有東西時,它會提取它,並將其作爲函數調用。
這可能是實現線程池的最簡單方法。
實際上我只需要'threadpool.tryStart(f)'而不是'start'例如我不需要排隊。因爲隊列可以無限長,因爲我的存款利率遠遠高於執行率。另一方面,由於存款利率太高,它最終將作爲投票工作。那麼維護隊列是否是正確的決定? (我在另一個線程中運行的'f'是一個Image比較器,我總是可以做一個代理回調,這個代理回調可以讓我控制是否將相同的回調多次放入隊列中,但仍然可以,沒有一個隊列是正確的決定?) – 2012-07-27 07:38:33
+1我使用這樣的顯式線程池很多,用多種語言。它比現代語言中的某些「內置」線程池實現提供了更好的控制,其中一些似乎做出了關於何時添加額外線程的不適當決定。 – 2012-07-27 10:37:37
在addtion什麼@Joachim發佈:
的一種方式,以流量控制這樣的系統(和一個我用了很多),是使用「池隊列」(阻止生產者 - 消費者隊列) ,在啓動時創建和填充任務數量固定的任務。任何想要發佈任務的線程都必須先從池中獲取一個線程,並在完成處理後將任務返回到池中。這限制了系統中的任務數量,並且如果池清空,請求線程只需等待,在空池中被阻塞,直到某些「已使用」任務回來。
這很好,控制,防止內存失控並消除創建/銷燬的連續任務。在定時器上週期性地顯示/寫入池隊列深度也很容易,所以你可以看到你的應用程序是如何「繁忙」的(並且檢測到任何泄漏:)。
編輯:另外,它不需要系統中的任何有界隊列。無界隊列更簡單,往往需要更少的系統調用。
'ftor'?你的意思是functor?請在下次拼寫出來。 – GManNickG 2012-07-27 05:51:17
是functor ...... – 2012-07-27 06:01:10
看看http://stackoverflow.com/questions/4084777/creating-a-thread-pool-using-boost – ForEveR 2012-07-27 06:06:12