黑马程序员技术交流社区

标题: 线程的优先级? [打印本页]

作者: lijun6459991    时间: 2011-12-15 20:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 李波    时间: 2011-12-15 20:46
程本身不存在调度问题的,调度的是线程。我们可以在Windows任务管理器设置某个进程的优先级类,微软使用优先级类仅仅是使问题简单化。当然,通过优先级类和相对线程优先级的配合,就可以得到线程的优先级值(BASE PRIORITY LEVEL)。

Windows系统有0~31共32个优先级值。大于15以上的优先级全部是Real-time级优先级,这是最高的优先级类,通常会首先调度这些优先级的线程。High、Normal、Idle这些优先级就是平时很常用的优先级类了。我们通常是使用Normal级。

Windows会自动微调线程的优先级,以至于低优先级的不至于太“饥饿”而分配不到CPU时间。系统可以将低优先级的线程自动调到15优先级值,分配完CPU时间之后,再将它的优先级值设回原来的优先级值。但是系统只会微调Normal优先级类的进程的线程。Real-time等都不会进行自动调度。

通常程序改变自身优先级的方法是使用SetPriorityClass、SetThreadPriority等API函数。通过GetPriorityClass、GetThreadPriority函数可以获取优先级类或相对线程优先级。


作者: 李波    时间: 2011-12-15 21:23
本帖最后由 李波 于 2011-12-15 21:24 编辑

C#线程优先级的必要性:如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要,该怎么办在这种情况下,可以在一个进程中为不同的线程指定不同的优先级。一般情况下,如果有优先级较高的线程在工作,就不会给优先级较低的线程分配任何时间片,其优点是可以保证给接收用户输入的线程指定较高的优先级。在大多数的时间内,这个线程什么也不做,而其他线程则执行它们的任务。但是,如果用户输入了信息,这个线程就立即获得比应用程序中其他线程更高的优先级,在短时间内处理用户输入事件。

C#线程优先级的规律:高优先级的线程可以完全阻止低优先级的线程执行,因此在改变线程的优先级时要特别小心。线程的优先级可以定义为ThreadPriority枚举的值,即Highest、AboveNormal、Normal、BelowNormal和 Lowest。

注意,每个进程都有一个基本优先级,这些值与进程的优先级是有关系的。给线程指定较高的优先级,可以确保它在该进程中比其他线程优先执行,但系统上可能还运行着其他进程,它们的线程有更高的优先级。因此Windows给自己的操作系统线程指定高优先级。

我空间里还有几篇关于多线程的文章,你可以去看看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2