Table of Contents

Name

Non-portable 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 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.

Author

Ross Johnson for use with Pthreads-w32.

See also




Table of Contents