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.