deps/w32-pthreads/manual/PortabilityIssues.html
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.
Table of Contents