Acho que você está procurando uma resposta portátil, mas um bom começo para entender isso é olhar para o comportamento no Linux, conforme documentado na manpage para sched(7)
, na seção" Políticas de agendamento ":
The scheduler is the kernel component that decides which runnable thread will be executed by the CPU next. Each thread has an associated scheduling policy and a static scheduling priority, sched_priority. The scheduler makes its decisions based on knowledge of the scheduling policy and static priority of all threads on the system.
For threads scheduled under one of the normal scheduling policies (
SCHED_OTHER
,SCHED_IDLE
,SCHED_BATCH
), sched_priority is not used in scheduling decisions (it must be specified as 0).Processes scheduled under one of the real-time policies (
SCHED_FIFO
,SCHED_RR
) have a sched_priority value in the range 1 (low) to 99 (high). (As the numbers imply, real-time threads always have higher priority than normal threads.) Note well: POSIX.1 requires an implementation to support only a minimum 32 distinct priority levels for the real-time policies, and some systems supply just this minimum. Portable programs should use sched_get_priority_min(2) and sched_get_priority_max(2) to find the range of priorities supported for a particular policy.
Veja também a documentação do POSIX para pthread_setschedparam
, que requer apenas três políticas ( SCHED_OTHER
, SCHED_FIFO
e SCHED_RR
) e declara que o comportamento sob o primeiro é definido pela implementação.
Portanto, se você deseja agendar threads usando uma prioridade, portably, você precisa usar a política apropriada primeiro (FIFO ou round-robin). Em seguida, você determina o intervalo de valores e define a prioridade conforme apropriado. Encadeamentos e processos são agendados por prioridade decrescente: encadeamentos com prioridade mais alta serão executados primeiro.
No Linux, o comportamento padrão (implementação definida por POSIX) usa uma prioridade dinâmica que é calculada com base no valor nice
e com que frequência um determinado segmento é não agendado. No Linux, o valor nice
determina a prioridade menor primeiro, então -20 é a prioridade mais alta, 19 a mais baixa. POSIX descreve nice
como um valor por processo, mas no Linux é por thread, então você pode usar para agendar threads lá (mas isso não é portátil).