2012-09-10 38 views
0

我想減少服務於parallel_for_each的線程的線程優先級,因爲在重負載條件下,它們消耗的處理器時間相對於其他線程我的系統。是否建議在parallel_for_each循環中使用Windows API的SetThreadPriority

問題:

1)做parallel_for_each的服務線程繼承調用線程的線程的優先級?在這種情況下,我大概可以在parallel_for_each之前和之後調用SetThreadPriority,並且一切都應該沒問題。

2)另外建議在parallel_for_each中調用SetThreadPriority?這將清楚地爲相同的線程多次調用API。這樣做是否有很大的開銷?

2.b)假設我這樣做,下次調用parallel_for_each時它是否會影響線程優先級 - 即是否需要重置每個線程的優先級?

3)我想知道一般的線程優先級。任何人都想評論:假設我有兩個線程爭奪一個處理器,一個被設置爲「低於正常」,而另一個則是「正常」優先級。粗略地說,一個線程與另一個線程相比,多花費多少處理器時間?

+0

很確定SetThreadPriority不會解決您的問題。您需要修改SchedulerPolicy類,PolicyElementKey :: ContextPriority來控制工作線程的優先級。 –

+0

@Hans確實減少了線程的數量,而不是降低優先級,這是需要的 –

回答

1
  1. 所有線程最初開始於THREAD_PRIORITY_NORMAL。所以你必須減少每個線程的優先級。或者降低擁有流程的優先級。

  2. 調用SetThreadPriority幾乎沒有開銷。一旦你喚醒線程,調用SetThreadPriority的額外開銷就可以忽略不計。一旦你設置線程的優先級,它將保持在該值直到更改。

  3. 假設您有一個處理器,並且有兩個線程可以運行。調度程序將始終選擇運行具有更高優先級的線程。這意味着在你的場景中,下面的普通線程永遠不會運行。實際上,調度比這還要多。例如優先倒置。但是,你可以這樣想。如果所有處理器都忙於正常優先級的線程,那麼預計較低優先級的線程會缺少CPU。

+0

謝謝@David - 這非常有幫助。 只是最後一件事。如果我正確理解你的答案1,那麼下一次我調用parallel_for_each時,無論我之前對它做了什麼,所有服務線程都將恢復爲THREAD_PRIORITY_NORMAL。 另外,從你的答案2我可以收集線程服務parallel_for_each的線程優先級將保持在我以前給他們的優先級。在這種情況下,我認爲要做的事情是執行另一個parallel_for_each來設置優先級。 有何評論? –

+0

嗯,我不知道'parallel_for_each'是如何實現的,但我認爲Hans評論指導你正確的方向。使用'SetThreadPriority'肯定是控制優先級的錯誤方法。而且,改變優先級只會導致你的線程根本無法運行。我懷疑你應該只使用較少的線程。 –

+0

我將瀏覽PolicyElementKey :: ContextPriority。 問題是,在低負載條件下,這個操作需要使用大量的線程,但是在高負載下線程數量會更少。使用線程優先級將是一個簡單的解決方案,可避免必須實施完整的負載平衡系統。 –

相關問題