Dot-Net

為什麼更改 ThreadPool(或任務)執行緒的優先級?

  • April 8, 2011

在 Web 和 Stack Overflow 上有很多地方不鼓勵更改ThreadPool執行緒或 TPL Task的優先級。特別是:

[“您無法控制執行緒池執行緒的狀態和優先級。”

“執行時管理執行緒池。你無法控制執行緒的調度,也無法更改執行緒的優先級。”](http://msdn.microsoft.com/en-us/library/ff647332.aspx)

“你不應該改變 PoolThread 的文化或優先級或……。就像你不油漆或重新裝飾一輛出租汽車一樣。”

“有幾種情況適合創建和管理自己的執行緒而不是使用執行緒池執行緒:(例如……)您需要一個執行緒具有特定的優先級。”

“ThreadPool 中的每個執行緒都以預設優先級執行,更改 ThreadPriority 的程式碼無效。”

但是,這樣做很簡單,並且調試器顯示更改似乎確實存在(只要可以讀回該值)。

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

那麼問題來了,這個特定禁忌的具體原因是什麼?

我的懷疑:這樣做會擾亂池的微妙負載平衡假設。但這並不能解釋為什麼有些消息來源說你不能改變它。

執行緒池,尤其是 .NET 4.0 執行緒池,有很多花招,是一個相當複雜的系統。加上任務和任務調度器,偷工減料和其他各種事情,現實是你不知道發生了什麼。執行緒池可能會注意到您的任務正在等待 I/O,並決定在您的任務上安排一些快速的事情或暫停您的執行緒以執行更高優先級的事情。您的執行緒可能以某種方式依賴於更高優先級的執行緒(您可能知道也可能不知道)並最終導致死鎖。您的執行緒可能會以某種異常方式死亡並且無法恢復優先級。

如果你有一個長時間執行的任務,你認為你的執行緒最好有一個較低的優先級,那麼執行緒池可能不適合你。雖然算法在 .NET 4.0 中得到了改進,但它仍然最適合用於創建新執行緒的成本與任務長度不成比例的短期任務。如果您的任務執行時間超過一兩秒,那麼創建新執行緒的成本是微不足道的(儘管管理可能很煩人)。

引用自:https://stackoverflow.com/questions/5589376