我知道不能在运行过程中更改线程池优先级,但是在线程池中运行的特定任务的优先级是否与调用进程的优先级有关呢?
换句话说,无论调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行?
谢谢。
更新1:我应该更加具体,我指的是 Parallel.ForEach 中的线程。
我知道不能在运行过程中更改线程池优先级,但是在线程池中运行的特定任务的优先级是否与调用进程的优先级有关呢?
换句话说,无论调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行?
谢谢。
更新1:我应该更加具体,我指的是 Parallel.ForEach 中的线程。
ThreadPool.QueueUserWorkItem(delegate(object state) {
Thread.CurrentThread.Priority = ThreadPriority.Highest;
// Code in this function will run with Highest priority
});
NORMAL_PRIORITY_CLASS + THREAD_PRIORITY_IDLE == 1
NORMAL_PRIORITY_CLASS + THREAD_PRIORITY_TIME_CRITICAL == 15
REALTIME_PRIORITY_CLASS + THREAD_PRIORITY_IDLE == 16
REALTIME_PRIORITY_CLASS + THREAD_PRIORITY_TIME_CRITICAL == 31
ThreadPool.QueueUserWorkItem(delegate(object s1) {
Thread.CurrentThread.Priority = ThreadPriority.Highest;
ThreadPool.QueueUserWorkItem(delegate(object s2) {
// This code is executed with ThreadPriority.Normal
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
// This code is executed with ThreadPriority.Lowest
});
// This code is executed with ThreadPriority.Highest
});
编辑: .NET任务使用线程池,因此仍适用于上述内容。例如,如果您正在使用Parallel.ForEach
枚举集合以增加线程优先级,则必须在循环内部执行此操作:
Parallel.ForEach(items, item => {
Thread.CurrentThread.Priority = ThreadPriority.Highest;
// Your code here...
});
注意:更改优先级时要小心。例如,如果两个线程使用共享资源(由锁保护),则存在许多竞争来获取该资源,其中一个具有最高优先级,然后您可能会得到非常高的CPU使用率(由于 Monitor.Enter
的自旋行为)。这只是一个问题,请参阅MSDN了解更多细节(增加线程的优先级甚至可能导致性能更差)。
线程池中的所有任务是否以相同的优先级运行,而不考虑调用进程的优先级?
必须如此。在池中丢弃的唯一内容是委托。它保存对对象的引用,但不保存将其丢弃的线程的引用。
目前正在运行的线程具有相同的优先级。但是对于尚未运行的线程,存在一个队列 - 因此实际上存在“优先级”。更令人困惑的是,操作系统可以提高(和限制)线程优先级,例如当线程池中的两个线程彼此依赖时(例如,一个线程阻塞另一个线程)。当然,每当某些东西在线程池上阻塞时,您就会浪费资源:D
话虽如此,您真的不应该改变线程优先级,无论是否使用线程池。您真的不需要这样做,而且线程(和进程)优先级的工作方式可能与您预期的不同 - 这根本不值得。将所有内容保持正常状态,只需忽略存在Priority
属性即可避免许多不必要的问题 :)
在互联网上可以找到很多好的解释 - 例如,http://blog.codinghorror.com/thread-priorities-are-evil/。当然,这些通常已经过时了 - 但线程优先级的概念也是如此 - 它们是为单核机器设计的,在操作系统并不擅长抢占式多任务处理的时代。