setThreadPriority 函数 (processthreadsapi.h)
设置指定线程的优先级值。 此值与线程进程的优先级类一起确定线程的基本优先级级别。
语法
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
参数
[in] hThread
要设置其优先级值的线程的句柄。
句柄必须具有 THREAD_SET_INFORMATION 或 THREAD_SET_LIMITED_INFORMATION 访问权限。 有关详细信息,请参阅 线程安全和访问权限。Windows Server 2003: 句柄必须具有 THREAD_SET_INFORMATION 访问权限。
[in] nPriority
线程的优先级值。 此参数的取值可为下列值之一:
如果线程具有 REALTIME_PRIORITY_CLASS 基类,则此参数也可以是 -7、-6、-5、-4、-3、3、4、5 或 6。 有关详细信息,请参阅 计划优先级。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
Windows Phone 8.1:Windows Phone应用商店应用可以调用此函数,但它不起作用。 函数将返回指示成功的非零值。
注解
每个线程都有由线程的优先级值及其进程的优先级类确定的基本优先级。 系统使用所有可执行线程的基本优先级级别来确定哪个线程获取下一段 CPU 时间。 线程在每个优先级级别以轮循机制方式进行计划,并且仅当较高级别没有可执行线程时,才会在较低级别调度线程。
SetThreadPriority 函数允许设置线程相对于其进程的优先级类的基本优先级。 例如,在调用 IDLE_PRIORITY_CLASS 进程的线程的 SetThreadPriority 中指定 THREAD_PRIORITY_HIGHEST 会将线程的基本优先级级别设置为 6。 有关显示优先级类和线程优先级值的每种组合的基本优先级的表,请参阅 计划优先级。
对于 IDLE_PRIORITY_CLASS、 BELOW_NORMAL_PRIORITY_CLASS、 NORMAL_PRIORITY_CLASS、 ABOVE_NORMAL_PRIORITY_CLASS和 HIGH_PRIORITY_CLASS 进程,当发生对线程很重要的事件时,系统会动态提升线程的基本优先级。 REALTIME_PRIORITY_CLASS 进程不会收到动态提升。
所有线程最初从 THREAD_PRIORITY_NORMAL开始。 使用 GetPriorityClass 和 SetPriorityClass 函数获取和设置进程的优先级类。 使用 GetThreadPriority 函数获取线程的优先级值。
使用流程的优先级类来区分时间关键型应用程序与具有正常或低于正常计划要求的应用程序。 使用线程优先级值来区分进程任务的相对优先级。 例如,处理窗口输入的线程的优先级可能高于对 CPU 执行密集计算的线程。
处理优先级时,请非常小心,确保高优先级线程不会占用所有可用的 CPU 时间。 基本优先级高于 11 的线程会干扰操作系统的正常运行。 使用 REALTIME_PRIORITY_CLASS 可能会导致磁盘缓存无法刷新、鼠标停止响应等。
THREAD_PRIORITY_* 值会影响线程的 CPU 计划优先级。 对于执行后台工作(如文件 I/O、网络 I/O 或数据处理)的线程,调整 CPU 计划优先级是不够的;即使空闲 CPU 优先级线程在使用磁盘和内存时也很容易干扰系统的响应能力。 执行后台工作的线程应使用 THREAD_MODE_BACKGROUND_BEGIN 和 THREAD_MODE_BACKGROUND_END 值来调整其资源计划优先级;与用户交互的线程不应使用 THREAD_MODE_BACKGROUND_BEGIN。
当线程处于后台处理模式时,它应尽量减少与进程中的其他线程共享资源(例如关键部分、堆和句柄),否则可能会发生优先级反转。 如果有线程以高优先级执行,则后台处理模式下的线程可能不会立即计划,但永远不会耗尽。
Windows Server 2008 和 Windows Vista: 当系统启动时, SetThreadPriority 函数返回成功返回值,但不会更改从系统启动文件夹启动或 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 注册表项中列出的应用程序的线程优先级。 这些应用程序在短时间内以降低优先级运行 (大约 60 秒) ,以使系统在启动期间对用户操作做出更快速的响应。
Windows 8.1和Windows Server 2012 R2:Windows 应用商店应用支持此函数。
Windows Phone 8.1:Windows Phone 应用商店应用可以调用此函数,但它不起作用。
示例
以下示例演示如何使用线程后台模式。
#include <windows.h>
#include <tchar.h>
int main( void )
{
DWORD dwError, dwThreadPri;
if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN))
{
dwError = GetLastError();
if( ERROR_THREAD_MODE_ALREADY_BACKGROUND == dwError)
_tprintf(TEXT("Already in background mode\n"));
else _tprintf(TEXT("Failed to enter background mode (%d)\n"), dwError);
goto Cleanup;
}
// Display thread priority
dwThreadPri = GetThreadPriority(GetCurrentThread());
_tprintf(TEXT("Current thread priority is 0x%x\n"), dwThreadPri);
//
// Perform background work
//
;
if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END))
{
_tprintf(TEXT("Failed to end background mode (%d)\n"), GetLastError());
}
Cleanup:
// Clean up
;
return 0;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | processthreadsapi.h (包括 Windows Vista 上的 Windows.h、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
Library | Kernel32.lib;Windows Phone 8.1 上的 WindowsPhoneCore.lib |
DLL | Kernel32.dll;Windows Phone 8.1 上的 KernelBase.dll |