setThreadPriority 函数 (processthreadsapi.h)

设置指定线程的优先级值。 此值与线程进程的优先级类一起确定线程的基本优先级级别。

语法

BOOL SetThreadPriority(
  [in] HANDLE hThread,
  [in] int    nPriority
);

参数

[in] hThread

要设置其优先级值的线程的句柄。

句柄必须具有 THREAD_SET_INFORMATIONTHREAD_SET_LIMITED_INFORMATION 访问权限。 有关详细信息,请参阅 线程安全和访问权限Windows Server 2003: 句柄必须具有 THREAD_SET_INFORMATION 访问权限。

[in] nPriority

线程的优先级值。 此参数的取值可为下列值之一:

优先级 含义
THREAD_MODE_BACKGROUND_BEGIN
0x00010000
开始后台处理模式。 系统降低了线程的资源计划优先级,以便它可以执行后台工作,而不会显著影响前台的活动。

仅当 hThread 是当前线程的句柄时,才能指定此值。 如果线程已处于后台处理模式,则函数将失败。

Windows Server 2003: 不支持此值。

THREAD_MODE_BACKGROUND_END
0x00020000
结束后台处理模式。 系统还原线程的资源计划优先级,就像线程进入后台处理模式之前一样。

仅当 hThread 是当前线程的句柄时,才能指定此值。 如果线程不处于后台处理模式,函数将失败。

Windows Server 2003: 不支持此值。

THREAD_PRIORITY_ABOVE_NORMAL
1
优先级高于优先级类 1 磅。
THREAD_PRIORITY_BELOW_NORMAL
-1
优先级低于优先级类 1 磅。
THREAD_PRIORITY_HIGHEST
2
优先级高于优先级类 2 磅。
THREAD_PRIORITY_IDLE
-15
IDLE_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASS、NORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASS或HIGH_PRIORITY_CLASS进程的基本优先级 1,REALTIME_PRIORITY_CLASS进程的基本优先级为 16。
THREAD_PRIORITY_LOWEST
-2
优先级低于优先级类 2 磅。
THREAD_PRIORITY_NORMAL
0
优先级类的正常优先级。
THREAD_PRIORITY_TIME_CRITICAL
15
IDLE_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASS、NORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASS或HIGH_PRIORITY_CLASS进程的基本优先级 15,REALTIME_PRIORITY_CLASS进程的基本优先级 31。
 

如果线程具有 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_CLASSBELOW_NORMAL_PRIORITY_CLASSNORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASS 进程,当发生对线程很重要的事件时,系统会动态提升线程的基本优先级。 REALTIME_PRIORITY_CLASS 进程不会收到动态提升。

所有线程最初从 THREAD_PRIORITY_NORMAL开始。 使用 GetPriorityClassSetPriorityClass 函数获取和设置进程的优先级类。 使用 GetThreadPriority 函数获取线程的优先级值。

使用流程的优先级类来区分时间关键型应用程序与具有正常或低于正常计划要求的应用程序。 使用线程优先级值来区分进程任务的相对优先级。 例如,处理窗口输入的线程的优先级可能高于对 CPU 执行密集计算的线程。

处理优先级时,请非常小心,确保高优先级线程不会占用所有可用的 CPU 时间。 基本优先级高于 11 的线程会干扰操作系统的正常运行。 使用 REALTIME_PRIORITY_CLASS 可能会导致磁盘缓存无法刷新、鼠标停止响应等。

THREAD_PRIORITY_* 值会影响线程的 CPU 计划优先级。 对于执行后台工作(如文件 I/O、网络 I/O 或数据处理)的线程,调整 CPU 计划优先级是不够的;即使空闲 CPU 优先级线程在使用磁盘和内存时也很容易干扰系统的响应能力。 执行后台工作的线程应使用 THREAD_MODE_BACKGROUND_BEGINTHREAD_MODE_BACKGROUND_END 值来调整其资源计划优先级;与用户交互的线程不应使用 THREAD_MODE_BACKGROUND_BEGIN

当线程处于后台处理模式时,它应尽量减少与进程中的其他线程共享资源(例如关键部分、堆和句柄),否则可能会发生优先级反转。 如果有线程以高优先级执行,则后台处理模式下的线程可能不会立即计划,但永远不会耗尽。

Windows Server 2008 和 Windows Vista: 当系统启动时, SetThreadPriority 函数返回成功返回值,但不会更改从系统启动文件夹启动或 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 注册表项中列出的应用程序的线程优先级。 这些应用程序在短时间内以降低优先级运行 (大约 60 秒) ,以使系统在启动期间对用户操作做出更快速的响应。

Windows 8.1Windows 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

另请参阅

GetPriorityClass

GetThreadPriority

进程和线程函数

计划优先级

SetPriorityClass

线程