2013-05-07 21 views
-1

這是一種情況。動態生成/取消線程以處理不同的負載

來自客戶端的多個TCP請求。請求負載變化。

當前服務器端線程池在程序初始化時實例化固定數量的線程。 動態生成/取消線程池中的線程會有什麼好的策略?

+3

線程池的重點在於你不會「動態地產生/取消線程」 – 2013-05-07 07:23:15

+1

根本不這樣做是一個好策略。 – 2013-05-07 07:23:44

+0

@MitchWheat請在David Schwartz的回答中看到我的評論。即使我使用線程池,它不是一個合法的原因嗎? – deepdive 2013-05-07 07:29:44

回答

0

沒有意義。你不需要更多的線程來做更多的工作。只需創建幾個線程,而不是一次可以有用地完成的事情數量,然後將其保留。

+0

所以你建議如果我在高峯負載中得到100個併發請求,我應該在程序初始化時產生至少100個線程。但是如果我的平均負載是10個併發請求呢?不會是100個線程看起來像資源濫用? – deepdive 2013-05-07 07:28:00

+0

@DivyangPatel:不,每個CPU產生一個線程,再加上一些線程,以防某些線程由於某種原因而阻塞。 CPU的數量決定了你可以一次做有用的事情的數量。希望你的線程池已經爲你處理。 – 2013-05-07 07:41:08

+0

@大衛這是非常有用的線索。但是,你有沒有任何有用的分析或鏈接可以提供一個矩陣,它可以顯示請求數,每個請求的工作量和產生的線程數之間的關係。那挺棒的。在此先感謝 – deepdive 2013-05-07 08:27:02

0

處理線程池的一種簡單方法是擁有一個線程向量,並且每個線程都有一個隊列std::function對象。線程只是從隊列中彈出一個函數,然後執行它。

您不必在創建線程池時創建/產生線程,因爲它們已經在運行。雖然線程沒有做任何工作,但他們要麼等待一個信號,告訴它隊列中有函數,要麼輪詢中間的睡眠隊列。

+0

這就是我正在使用我的線程池。請參閱David Schwartz關於資源濫用空閒線程的回答。 – deepdive 2013-05-07 07:32:02

+0

@DivyangPatel如果您使用某種信號而不是輪詢(例如['std :: condition_variable'](http://en.cppreference.com/w/cpp/thread/condition_variable)),那麼資源使用率爲最小的。首先線程不會使用任何CPU週期,其次睡眠線程使用的內存可以忽略不計。 – 2013-05-07 07:40:06

+0

是的,我正在使用condition_variable將請求項目的隊列發送到線程池。 – deepdive 2013-05-07 08:23:58