Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
进程优先级和线程池优先级之间的任何关系(C#)_C#_Multithreading_Threadpool_Thread Priority - Fatal编程技术网

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

进程优先级和线程池优先级之间的任何关系(C#),c#,multithreading,threadpool,thread-priority,C#,Multithreading,Threadpool,Thread Priority,我理解线程池优先级应该/不能由正在运行的进程更改,但是线程池上运行的特定任务的优先级是否与调用进程优先级一起定价 换句话说,不管调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行 多谢各位 更新1:我应该更具体一些,我指的是Parallel.ForEach中的线程 不管调用进程优先级如何,线程池中的所有任务是否都以相同的优先级运行 他们必须这样做。在游泳池唯一放下的东西就是一名代表。它包含对对象的引用,但不包含对删除该对象的线程的引用 当前正在运行的具有相同的优先级。但是对于那些还

我理解线程池优先级应该/不能由正在运行的进程更改,但是线程池上运行的特定任务的优先级是否与调用进程优先级一起定价

换句话说,不管调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行

多谢各位

更新1:我应该更具体一些,我指的是Parallel.ForEach中的线程

不管调用进程优先级如何,线程池中的所有任务是否都以相同的优先级运行


他们必须这样做。在游泳池唯一放下的东西就是一名代表。它包含对对象的引用,但不包含对删除该对象的线程的引用

当前正在运行的具有相同的优先级。但是对于那些还没有运行的,有一个队列——所以在实践中,有一个“优先级”。更令人困惑的是,操作系统可以提高(并限制)线程优先级,例如,当线程池中的两个线程相互依赖时(例如,一个线程阻塞另一个线程)。当然,任何时候线程池出现阻塞,都是在浪费资源:D

也就是说,你根本不应该改变线程优先级,不管是不是线程池。你真的不需要这样做,而且线程(和进程)优先级并没有按照你可能期望的方式工作——这不值得。保持一切正常,只需忽略有一个
Priority
属性,就可以避免许多不必要的问题:)

你会在网上找到很多很好的解释,例如。当然,这些通常是过时的——但线程优先级的概念也是过时的——它们是为单核机器设计的,当时操作系统并不擅长先发制人的多任务处理,真的

我理解线程池优先级应该/不能由正在运行的进程更改

那不准确。您可以更改线程池的线程优先级(在委托本身内部),它将以新的优先级运行,但默认优先级将在其任务完成时恢复,并将发送回线程池

ThreadPool.QueueUserWorkItem(delegate(object state) {
    Thread.CurrentThread.Priority = ThreadPriority.Highest;

    // Code in this function will run with Highest priority
});
线程池上运行的特定任务的优先级是否与调用进程优先级有一定的关系

是的,它不仅适用于线程池的线程。在Windows中,进程的优先级由其类给出(从
IDLE\u priority\u class
REALTIME\u priority\u class
)。它与线程的优先级(从
thread\u priority\u IDLE
thread\u priority\u TIME\u CRITICAL
)一起用于计算线程的最终优先级

从MSDN:

进程优先级类和线程优先级级别组合在一起,形成每个线程的基本优先级

请注意,它不仅仅是一个基本优先级加上一个偏移:

NORMAL_PRIORITY_CLASS + THREAD_PRIORITY_IDLE  == 1
NORMAL_PRIORITY_CLASS + THREAD_PRIORITY_TIME_CRITICAL == 15
但是:

此外,线程可以有一个临时提升(由Windows调度程序决定和管理)。请注意,进程也可以更改其自身的优先级类别

换句话说,不管调用进程的优先级如何,线程池中的所有任务是否都以相同的优先级运行

不,线程的优先级取决于进程的优先级(请参阅上一段),池中的每个线程可以具有不同的优先级。还要注意,线程优先级不受调用线程优先级的影响:

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使用率结束(因为
监视器。Enter
)。这只是一个问题,有关更多详细信息,请参阅MSDN(增加线程优先级甚至可能导致性能下降)。

进程不能相互使用线程池,我想您的意思是进程==线程。谢谢。但如果我用100%的cpu运行我的作业超过1小时,我肯定会遇到另一个不必要的更大问题:>@DayDayHappy是的,通常是这样。探查器可以帮助您确定这一点——我看到过一些代码占用了很长的时间,但占用了100%的CPU,这只是因为多线程性能差。这就是说,如果消耗是自然的,那么100%的CPU使用率没有什么错——现代操作系统和CPU通常可以在不影响系统整体性能的情况下处理它。如果您真的想,您可以随时添加节流,但这并不是必须的。线程优先级更可能是有害的,而不是有益的——当每个人都正常时,调度程序真的工作得最好:Dtrue。我99%的习惯是降低流程优先级,因为我想让位于其他人,因为我知道我的任务正在长时间运行,并且允许它意外地长时间运行。thanks@DayDayHappy是的,我完全理解这一点——在Windows3.1(以及在较小程度上的95系列)上,它曾经是一种非常好的防御性编码方式。通常情况下,这对NT没有什么帮助。有趣的是,即使在那时,它仍然非常有用,因为其他应用程序编写错误(包括错误地管理其线程/进程优先级)。事实上,这就是为什么首先添加了先发制人的多线程的原因之一——以防止编写糟糕的应用程序杀死/冻结整个系统:D
Parallel.ForEach(items, item => {
    Thread.CurrentThread.Priority = ThreadPriority.Highest;

    // Your code here...
});