SetThreadPriority と SetThreadPriority のメモ

Windowsでプロセスやスレッドの優先度を指定する方法のメモ.

※OSのバージョン等によって,設定値や動作が違う場合がある模様なので注意.

優先度の基本的な考え方

  • 0(もっとも低い)〜31(もっとも高い)であらわされる優先度によって,スレッドの実行をスケジューリング
  • 優先度 = Process priority class (プロセスの優先度) + Thread priority level (スレッドの優先度)

プロセスの優先度について

プロセスの優先度を任意に変更するためには,たとえば次のように指定する.

  // プロセスの優先度設定 → もっとも高い(REALTIME)
  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

Priority Class の指定の仕方については,次の順番で優先度が高い.

REALTIME_PRIORITY_CLASS // もっとも優先
HIGH_PRIORITY_CLASS // 優先度高
ABOVE_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS // 通常
BELOW_NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS // アイドル時

スレッドの優先度について

スレッドの優先度について変更するためには,たとえば次のように指定する.

SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL));

プロセスの優先度をもとに,相対値を指定する.次の順番で優先度が高い.

THREAD_PRIORITY_TIME_CRITICAL // 15 (プロセスが REALTIME_PRIORITY_CLASS のとき 31)
THREAD_PRIORITY_HIGHEST // 基準 +2
THREAD_PRIORITY_ABOVE_NORMAL // 基準 +1
THREAD_PRIORITY_NORMAL // 基準
THREAD_PRIORITY_BELOW_NORMAL // 基準 -1
THREAD_PRIORITY_LOWEST // 基準 -2
THREAD_PRIORITY_IDLE // 1 (プロセスが REALTIME_PRIORITY_CLASS のとき 16)

Process priority class と Thread priority level の組み合わせ

最終的な優先度の値については,http://msdn.microsoft.com/en-us/library/ms685100(v=VS.85).aspx を参照すれば一目瞭然である.