다음을 통해 공유


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

스레드의 우선 순위 값입니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

우선 순위 의미
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_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_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_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS또는HIGH_PRIORITY_CLASS 프로세스의 기본 우선 순위는 15이고 REALTIME_PRIORITY_CLASS 프로세스의 기본 우선 순위는 31입니다.
 

스레드에 REALTIME_PRIORITY_CLASS 기본 클래스가 있는 경우 이 매개 변수는 -7, -6, -5, -4, -3, 3, 4, 5 또는 6일 수도 있습니다. 자세한 내용은 우선 순위 예약을 참조하세요.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

Windows Phone 8.1: Windows Phone 스토어 앱은 이 함수를 호출할 수 있지만 아무런 효과가 없습니다. 함수는 성공을 나타내는 0이 아닌 값을 반환합니다.

설명

모든 스레드에는 스레드의 우선 순위 값과 프로세스의 우선 순위 클래스에 따라 결정되는 기본 우선 순위 수준이 있습니다. 시스템은 모든 실행 스레드의 기본 우선 순위 수준을 사용하여 CPU 시간의 다음 조각을 가져오는 스레드를 결정합니다. 스레드는 각 우선 순위 수준에서 라운드 로빈 방식으로 예약되며, 더 높은 수준에서 실행 가능한 스레드가 없는 경우에만 낮은 수준에서 스레드를 예약합니다.

SetThreadPriority 함수를 사용하면 프로세스의 우선 순위 클래스를 기준으로 스레드의 기본 우선 순위 수준을 설정할 수 있습니다. 예를 들어 IDLE_PRIORITY_CLASS 프로세스의 스레드에 대해 SetThreadPriority 호출에서 THREAD_PRIORITY_HIGHEST 지정하면 스레드의 기본 우선 순위 수준이 6으로 설정됩니다. 우선 순위 클래스와 스레드 우선 순위 값의 각 조합에 대한 기본 우선 순위 수준을 보여 주는 테이블은 우선 순위 예약을 참조하세요.

IDLE_PRIORITY_CLASS BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_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 7, Windows Server 2008 Windows Server 2008 R2의 Windows.h 포함)
라이브러리 Kernel32.lib; Windows Phone 8.1의 WindowsPhoneCore.lib
DLL Kernel32.dll; Windows Phone 8.1의 KernelBase.dll

추가 정보

GetPriorityClass

GetThreadPriority

프로세스 및 스레드 함수

예약 우선 순위

SetPriorityClass

스레드