目前我在需要一種簡單高效的線程池實現的。我在這裏和谷歌搜索了很多有趣的鏈接,但到目前爲止我找到的東西似乎都很合適。我在網絡上發現的大多數實現都太複雜或者缺乏一些我需要的關鍵特性。實現一個簡單的線程池
此外,我不希望使用的代碼,我不明白,所以我決定編寫它自己(有時重新發明輪子幫助我向前推動自己在知識和經驗方面)。我當然明白線程池背後的基本思想,但是一些實現細節對我來說還是有點不清楚。這可能是因爲我需要的線程池有點特別。讓我描述一下。我有一個任務在特定的(大)緩衝區上完成了數十萬次。我測量過,如果我爲這個任務使用線程,性能會好很多 - 緩衝區被分割成子緩衝區,每個線程都在子緩衝區上執行任務並返回結果。然後所有線程的所有結果加在一起,給我最終的解決方案。
然而,因爲這樣做很多時候我失去了,因爲這麼多的線程創建的寶貴的時間(因爲自帶的線程創建的開銷)。所以我想有一個線程池來執行這個任務,而不是每次創建一組新的線程。
更清楚,這是我到目前爲止有:
- 斯普利特緩衝成相同大小
- 對於每個子緩衝器的N個子緩衝區,創建一個線程並運行它在副緩衝
- 等待所有線程完成(WaitForMultipleObjects的),加在一起的結果和destory螺紋
- 重複
我想要實現的是這樣的:
- 拆分緩衝成相同大小
- 分配每個子緩衝器從線程池的螺紋(其具有正好N個線程) 的N個子緩衝器
- 一旦線程結束,讓它睡覺,直到當所有的線程完成(睡覺),另一個任務是準備
- 加在一起,他們通過喚醒線程產生
- 重複的結果,併爲它們分配新的任務
正如你可以看到,這是一個有點特殊的線程池,因爲我需要等待線程完成。基本上我想擺脫創建線程的所有時間的開銷,因爲程序經過成千上萬次迭代的,因此它可以創建&銷燬線程的milions在其生命週期。好消息是,我不需要在線程之間進行任何同步,他們都獲得了自己的數據和存儲空間。但是,我必須等到所有線程完成後纔能有最終解決方案,因爲下一個任務取決於前一個任務的結果。
我的主要問題是與線程的管理:
- 如何讓我的線程「休眠」,並喚醒他們一次新的任務是準備好了?
- 我該如何等待所有線程完成?
我會感謝任何幫助。如果我不夠清楚,也可以隨時提問。謝謝!
我沒有看到它有什麼特別之處,阻塞線程完成是完全正常的。由OS實現的線程池將工作得很好。使用QueueUserWorkItem(),CreateEvent和SetEvent進行同步。 – 2012-03-06 11:22:31
@HansPassant:嗨,謝謝你的建議。你可能會把它作爲一個答案與更多的細節?我不熟悉你提到的功能。 – PeterK 2012-03-06 11:37:38
您發現WaitForMultipleObjects()的地方相同,請使用MSDN Library。 – 2012-03-06 11:46:16