2012-03-13 80 views
2

我有N個任務,它們是獨立的(即寫入不同的內存地址),但不需要完全相同的時間完成(例如2到10秒)。我有P線程。多線程獨立任務

我可以將我的N個任務分成P個線程,並啓動我的線程。最終,最後會剩下一個線程來完成最後幾項任務,這不是最優的。

我也可以啓動P線程,每個線程有1個任務,WaitForMultipleObjects,並重新啓動P線程等(這就是我目前所做的,因爲與任務相比,創建線程的開銷很小)。但是,這也不能解決問題,在某些時候仍然會有P-1線程等待最後一個線程。

有沒有辦法啓動線程,只要線程完成任務,就繼續下一個可用任務,直到完成所有任務?

謝謝!

+0

就這麼你知道,你可能不想嘗試自己做這個。使併發算法/結構既快速又正確比聽起來更難。查看[Intel的TBB](http://threadingbuildingblocks.org/)。 – GManNickG 2012-03-13 23:01:32

回答

2

是的,它被稱爲線程池。這是一個非常普遍的做法。

http://en.wikipedia.org/wiki/Thread_pool_pattern

基本上,你創建的任務隊列(與它們的參數函數指針),並推動任務那裏。你有N個線程運行的做下面的循環(原理圖碼):

while (bRunning) { 
    task = m_pQueue.pop(); 
    if (task) { 
     executeTask(task); 
    } 
    else { 
    //you can sleep a bit here if you want 
    } 
} 

有更優雅的方式來實現它(避免睡等),但是這是它的要點。

+0

好的謝謝...我已經使用線程池,但只是爲了消除啓動線程的必要性,而不是爲了這個問題。謝謝 ! – WhitAngl 2012-03-14 00:43:26