SetThreadPriority和SetPriorityClass

我不明白如何使用SetThreadPrioritySetPriorityClass来降低和增加一个线程的优先级。

我的理解是, SetPriorityClassselect可用于进程的优先级范围, SetThreadPriority设置类内的相对优先级。

例如,对于一个线程执行此操作的结果是什么:

 SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN); SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 

感谢帮助。

Solutions Collecting From Web of "SetThreadPriority和SetPriorityClass"

进程优先级和线程优先级正在构建一个线程的base priority 。 请参阅调度优先级以查找优先级如何组装。 通过查看这个列表,很清楚你的理解是正确的; 在某个优先级内, base priority可以具有由thread priority确定的各种值。

所有Windows版本都不支持SetPriorityClassPROCESS_MODE_BACKGROUND_BEGIN值和SetPriorityClassTHREAD_MODE_BACKGROUND_END值。

PROCESS_MODE_BACKGROUND_BEGIN: 系统降低进程(及其线程)的资源调度优先级,以便它可以执行后台工作,而不会显着影响前台的活动。

THREAD_MODE_BACKGROUND_END: 结束后台处理模式。 系统在线程进入后台处理模式之前,恢复线程的资源调度优先级。

这里所讨论的场景的结果是可预测的: SetPriorityClass将把它的所有线程进程设置为background processing mode 。 以下SetThreadPriority将只从background processing mode释放一个线程。 但是该进程的所有其他可能的线程将保持后台处理模式。

注意:只有process priority class thread priority的组合决定了base priority 。 因此,对GetThreadPriority的调用和对GetPriorityClass的调用GetPriorityClass不会返回基本优先级。 只有它们的组合才能释放上面“计划优先级”链接中描述的基本优先级。 不幸的是,新的background processing mode值尚未包含在base priority列表中。 但名称的base priority告诉了这里重要的事情:根据基本优先级(从进程优先级和线程优先级派生而来),允许调度器动态调整调度优先级。 后台模式只是fine tune调度优先级的另一种方式。 另一种方式是优先增强 。 优先级提升功能存在一段时间。 对SetThreadPrioritySetPriorityClass background processing mode值的新访问直接打开了优先级提升功能。 在Windows XP中,必须通过调用SetProcessPriorityBoost来完成。

关于PROCESS_MODE_BACKGROUND_BEGIN一件事,我已经注意到了,但是显然没有被记录下来,至少在Windows 7下,它永远地清空了进程的工作集 ,无论进程如何访问内存 – 直到后台模式结束。

例如,通常没有PROCESS_MODE_BACKGROUND_BEGIN ,当我的机器具有千兆字节的可用内存,并且进程需要消耗并不断处理千兆字节的内存时, 进程工作集大约等于分配大小。 也就是说,该进程获取它在其工作集中使用的所有内存。 好。
现在,使用PROCESS_MODE_BACKGROUND_BEGIN工作集将会是几十兆字节!
不好的结果是,这导致了不断的页面错误 ,并且计算运行速度慢得多! 页面错误可能不是页面文件,而是Windows缓存。 但页面错误仍然使计算速度显着下降,同时导致CPU消耗无意义的负载。

总之, PROCESS_MODE_BACKGROUND_BEGIN不适用于低优先级的后台工作 。 这项工作将非常耗时, 能源效率低下
PROCESS_MODE_BACKGROUND_BEGIN仅适用于进程实际上不打算在后台执行任何操作的情况

相比之下THREAD_MODE_BACKGROUND_BEGIN没有这种可怕的效果,即使线程是进程中唯一的线程。
另请注意,您只需使用PROCESS_MODE_BACKGROUND_END即可关闭PROCESS_MODE_BACKGROUND_END 。 在PROCESS_MODE_BACKGROUND_BEGIN之后调用THREAD_MODE_BACKGROUND_END是不够的。
所以Arno并不完全正确,声明THREAD_MODE_BACKGROUND_END即使对于单个线程也THREAD_MODE_BACKGROUND_END解除PROCESS_MODE_BACKGROUND_BEGIN的影响。

附加说明:带有bDisablePriorityBoost = TRUE SetProcessPriorityBoost在工作集上没有任何效果。