Portability issues
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 Pthreads-w32 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, pthreads-win32 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 pthreads-w32 can use the Win32 defined priority macros THREAD_PRIORITY_IDLE through THREAD_PRIORITY_TIME_CRITICAL.
Ross Johnson for use with Pthreads-w32.