PORTABILITY ISSUES manual page

#### POSIX Threads for Windows – REFERENCE – Pthreads4W

Reference Index

#### Table of Contents

## Name

Portability issues

## Synopsis

Thread priority

## Description

### Thread priority

POSIX defines a single contiguous range of numbers that determine a thread's priority. Win32 defines priority classes - and priority levels relative to these classes. Classes are simply priority base levels that the defined priority levels are relative to such that, changing a process's priority class will change the priority of all of it's threads, while the threads retain the same relativity to each other.

A Win32 system defines a single contiguous monotonic range of values that define system priority levels, just like POSIX. However, Win32 restricts individual threads to a subset of this range on a per-process basis.

The following table shows the base priority levels for combinations of priority class and priority value in Win32.

  | Process Priority Class | Thread Priority Level
  1 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  1 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  1 | NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  1 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  1 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  2 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  3 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  4 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  4 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  5 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  5 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  5 | Background NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  6 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  6 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  6 | Background NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  7 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  7 | Background NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  7 | Foreground NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  8 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  8 | NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  8 | Foreground NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  8 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  9 | NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  9 | Foreground NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  9 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  10 | Foreground NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  10 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  11 | Foreground NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  11 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  11 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  12 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  12 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  13 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  14 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  15 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  15 | HIGH_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL
  15 | IDLE_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL
  15 | BELOW_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL
  15 | NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL
  15 | ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL
  16 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE
  17 | REALTIME_PRIORITY_CLASS | -7
  18 | REALTIME_PRIORITY_CLASS | -6
  19 | REALTIME_PRIORITY_CLASS | -5
  20 | REALTIME_PRIORITY_CLASS | -4
  21 | REALTIME_PRIORITY_CLASS | -3
  22 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_LOWEST
  23 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_BELOW_NORMAL
  24 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_NORMAL
  25 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_ABOVE_NORMAL
  26 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_HIGHEST
  27 | REALTIME_PRIORITY_CLASS | 3
  28 | REALTIME_PRIORITY_CLASS | 4
  29 | REALTIME_PRIORITY_CLASS | 5
  30 | REALTIME_PRIORITY_CLASS | 6
  31 | REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_TIME_CRITICAL

Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported.

As you can see, the real priority levels available to any individual Win32 thread are non-contiguous.

An application using PThreads4W should not make assumptions about the numbers used to represent thread priority levels, except that they are monotonic between the values returned by sched_get_priority_min() and sched_get_priority_max(). E.g. Windows 95, 98, NT, 2000, XP make available a non-contiguous range of numbers between -15 and 15, while at least one version of WinCE (3.0) defines the minimum priority (THREAD_PRIORITY_LOWEST) as 5, and the maximum priority (THREAD_PRIORITY_HIGHEST) as 1.

Internally, PThreads4W maps any priority levels between THREAD_PRIORITY_IDLE and THREAD_PRIORITY_LOWEST to THREAD_PRIORITY_LOWEST, or between THREAD_PRIORITY_TIME_CRITICAL and THREAD_PRIORITY_HIGHEST to THREAD_PRIORITY_HIGHEST. Currently, this also applies to REALTIME_PRIORITY_CLASS even if levels -7, -6, -5, -4, -3, 3, 4, 5, and 6 are supported.

If it wishes, a Win32 application using PThreads4W can use the Win32 defined priority macros THREAD_PRIORITY_IDLE through THREAD_PRIORITY_TIME_CRITICAL.

## Author

Ross Johnson for use with Pthreads4W.

## See also

Table of Contents

- Name

- Synopsis

- Description

- Author

- See also