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.