为什么*不*改变ThreadPool(或任务)线程的优先级?

Gle*_*den 24 .net task threadpool task-parallel-library thread-priority

Web和Stack Overflow中有很多地方不鼓励改变ThreadPool线程或TPL 任务的优先级.特别是:

"你无法控制线程池线程的状态和优先级."
"运行时管理线程池.您无法控制线程的调度,也无法更改线程的优先级."

"你不应该改变PoolThread的文化或优先级......或者就像你没有画出或重新装修租赁汽车一样."

"在某些情况下,创建和管理自己的线程而不是使用线程池线程是合适的:(例如...)您需要一个线程具有特定的优先级."

"ThreadPool中的每个线程都以默认优先级运行,而更改ThreadPriority的代码无效."

但是,这样做很简单,调试器显示更改似乎确实存在(只要值可以回读).

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)

所以问题是,这个禁忌的具体原因是什么?

我怀疑:这样做会扰乱游泳池的微妙负载平衡假设.但这并不能解释为什么有些消息来源说你无法改变它.

Tal*_*joe 21

线程池,特别是.NET 4.0线程池,有很多技巧,是一个相当复杂的系统.添加任务和任务调度程序以及工作窃取和各种其他事情,现实是你不知道发生了什么.线程池可能会注意到您的任务正在等待I/O并决定快速安排任务,或者暂停线程以运行更高优先级的事务.您的线程可能以某种方式成为优先级较高的线程(您可能或可能不知道)的依赖项,并最终导致死锁.您的线程可能会以某种异常方式死亡,无法恢复优先级.

如果你有一个长期运行的任务,你认为你的线程最好具有较低的优先级,那么线程池可能不适合你.虽然.NET 4.0中的算法得到了改进,但它仍然最适合用于创建新线程的成本与任务长度不成比例的短期任务.如果您的任务运行超过一两秒,则创建新线程的成本微不足道(尽管管理可能很烦人).


Mic*_*ael 8

我已经完成了一个减小大小的线程池的实验,这似乎表明线程的优先级在返回池后重置为正常.这个关于线程的资源似乎证实了这一点.因此,即使你这样做,效果似乎也非常有限.