当前位置: 首页 > 编程语言 > C#

进程优先级和线程池优先级的任何关系(C#)分享

时间:2023-04-10 15:05:54 C#

进程优先级和线程池优先级的任何关系(C#)我知道线程池优先级应该/不能被正在运行的进程改变,但是在线程池上运行的特定任务的优先级是否与调用进程的优先级有某种关联?换句话说,不管调用进程的优先级如何,线程池中的所有任务都以相同的优先级运行?谢谢更新1:我应该更具体一些,我在Parallel.ForEach中引用线程我知道正在运行的进程应该/不能更改线程池优先级,这不准确。您可以更改线程池(在委托内)的线程优先级,它将以新的优先级运行,但是当它的任务完成时,它将恢复并将它发送回池中。ThreadPool.QueueUserWorkItem(delegate(objectstate){Thread.CurrentThread.Priority=ThreadPriority.Highest;//此函数中的代码将以最高优先级运行});线程池上运行的具体任务的优先级是否与调用进程的优先级相同有一定关系?是的,它不仅适用于线程池线程。在Windows进程中,优先级由其类指定(从IDLE_PRIORITY_CLASS到REALTIME_PRIORITY_CLASS)。它与线程的优先级(从THREAD_PRIORITY_IDLE到THREAD_PRIORITY_TIME_CRITICAL)一起用于计算线程的最终优先级。来自MSDN:结合进程优先级和线程优先级来形成每个线程的基本优先级。请注意请,它不仅仅是基本优先:normal_priority_class+thread_priority_idle==1normal_priority_class+thread_class+thread_priority_time_time_critical_critical_critical==15但:真实时间Windows调度程序决策和管理)。请注意,进程也可以更改自己的优先级。换句话说,不管调用进程的优先级如何,线程池中的所有任务都以相同的优先级运行?不,线程的优先级取决于进程的优先级(见上一段),池中的每个线程可以暂时拥有不同的优先级。还要注意线程优先级不受调用者线程优先级的影响:ThreadPool.QueueUserWorkItem(delegate(objects1){Thread.CurrentThread.Priority=ThreadPriority.Highest;ThreadPool.QueueUserWorkItem(delegate(objects2){//这段代码被执行withThreadPriority.NormalThread.CurrentThread.Priority=ThreadPriority.Lowest;//这段代码以ThreadPriority.Lowest执行});//这段代码以ThreadPriority.Highest执行});编辑:.NET任务使用线程池比上面写的仍然适用。例如,如果您使用Parallel.ForEach枚举集合以提高线程优先级,则必须在循环中执行此操作:Parallel.ForEach(items,item=>{Thread.CurrentThread.Priority=ThreadPriority.Highest;//你的代码这里...});只是一个警告:更改优先级时要小心。例如,如果两个线程使用一个共享资源(由锁保护),有很多次争用该资源,其中一个具有最高优先级,那么您最终可能会得到非常高的CPU使用率(因为自旋Monitor.Enter行为)Monitor.Enter)。这只是一个问题,有关详细信息,请参阅MSDN(增加线程的优先级甚至可能导致更差的性能)。无论调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行?他们一定。池中唯一下降的是代表。它包含对对象的引用,但不包含删除它的线程。当前正在运行的具有相同的优先级。但是那些队列还没有运行——所以在实践中,有一个“优先级”。更令人困惑的是,操作系统可以提高(和限制)线程优先级,例如当线程池中的两个线程相互依赖时(例如,一个阻塞另一个)。当然,只要线程池出现阻塞,您就是在浪费资源:D也就是说,您根本不应该真正更改线程优先级。你真的不需要,线程(和进程)优先级不会像你期望的那样工作——这是不值得的。保持一切正常,只要忽略有一个Priority属性,就可以避免很多不必要的问题:)你会在互联网上找到很多很好的解释-例如,http://blog.codinghorror.com/thread-priorities-are-evil/。当然,这些通常已经过时了——但线程优先级的概念是——它们是为单核机器设计的,当时操作系统还不太擅长抢占式多任务处理。以上就是C#学习教程的全部内容:进程优先级和线程池优先级之间的任何关系(C#)。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: