2012-12-12 94 views
0

我想在多線程系統中調度任務。我的想法是每個線程都有一個本地隊列,每個線程都會從本地隊列中獲取作業。但是當線程達到某個閾值時,它不應該獲取作業,而應該將作業轉移到低於閾值級別的線程。在多線程中調度任務

我的疑問是如何設置線程的閾值。

+2

有沒有足夠的信息在這裏回答你的問題。對於初學者,您還沒有指定您使用的平臺或編程語言,我不知道您的「閾值」是什麼意思。 –

+0

我正在使用Microsoft Visual Studio中的C++編程語言。從某種意義上說,當一個線程非常繁忙時,它不應該再取出工作,而應該將工作轉移到另一個空閒的線程。這有助於在線程間進行負載平衡。我的問題就像如何設置一個線程不會接受任何工作的限制。 – Rd7

+0

請讓我知道,如果它仍然不清楚,謝謝 – Rd7

回答

1

這個問題的另一種安排是讓已完成隊列的線程能夠從其他隊列中取出工作。這被稱爲「工作竊取」,並且是衆所周知的調度算法,例如

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.8905

+0

雅我知道任務竊取,但該方法是更多的開銷和更大的延遲..!我提出的想法會降低兩者,但我在實施 – Rd7

+1

時存在這些疑問。我不太確定我瞭解額外的延遲和開銷涉及「工作竊取」與「工作委託」(您的模式)。你能解釋一下嗎? –

+0

工作盜取有時會導致'代價昂貴的遠程竊取',就像線程1處於空閒狀態,線程8處於繁忙狀態,從第1個線程竊取第8個線程會增加我猜測的延遲。 – Rd7

0
您正在使用什麼的線程庫

我在我的所有線程項目TBB和Cilk Plus中使用了兩個OSS庫。這些更高級別的運行時提供的一個功能是,它們可以自動將任務安排到線程,從而有效利用處理器資源。運行時對負載平衡許多任務也非常有效。

www.threadingbuildblocks.org

www.cilkplus.org