Последовательное выполнение этих действий позволяет установить стратегию планирования и приоритет потока до его создания. Для динамического изменения стратегии планирования и приоритета используйте функции pthread_setschedparam () и pthread_setschedprio().
Синопсис
#include
int pthread_setschedparam(pthread_t thread,
int policy,
const struct sched_param *param);
int pthread_getschedparam(
pthread_t thread,
int *restrict policy,
struct sched_param *restrict param);
int pthread_setschedprio(pthread_t thread, int prio);
Функция pthread_setschedparam() устанавливает как стратегию планирования, так и приоритет потока без использования атрибутного объекта. Параметр
Таблица4.7. Условия потенциального неудачного завершения функций установки стратегии планирования и приоритета
pthread_getschedparam
• Параметр thread не ссылается на существующий поток
pthread_setschedparam
• Некорректен параметр policy или один из членов структуры, на которую указывает параметр param
• Параметр policy или один из членов структуры, на которую указывает параметр param, содержит значение, которое не поддерживается в данной среде
• Вызывающий поток не имеет соответствующего разрешения на установку значений приоритета или стратегии планирования для заданного потока
• Параметр thread не ссылается на существующий поток
• Данная реализация не позволяет приложению заменить один из параметров планирования заданным значением
pthread_setschedprio
• Параметр prio не подходит к стратегии планирования заданного потока
• Параметр prio имеет значение, которое не поддерживается в данной среде
• Вызывающий поток не имеет соответствующего разрешения на установку приоритета для заданного потока
• Параметр thread не ссылается на существующий поток
• Данная реализация не позволяет приложению заменить значение приоритета заданным
Функция pthread_setschedprio() используется для установки значения приоритета выполняемого потока, идентификатор которого задан параметром thread В результате выполнения этой функции текущее значение приоритета будет заменено значением параметра prio. При успешном выполнении функция возвращает число 0 в противном случае — код ошибки. При неуспешном выполнении функции приоритет потока изменен не будет. Условия, при которых эта функция может завершиться неуспешно, также перечислены в табл. 4.7.
ПРИМЕЧАНИЕ: к изменению стратегии планирования или приоритета выполняемого потока необходимо отнестись очень осторожно. Это может непредсказуемым образом повлиять на общую эффективность приложения. Потоки с более высоким приоритетом будут вытеснять потоки с более низким, что приведет к зависанию либо к тому, что поток будет постоянно выгружаться с процессора и поэтому не сможет завершить выполнение.
Установка области конкуренции потока
Область конкуренции потока определяет, какое множество потоков с одинаковыми стратегиями планирования и приоритетами будут состязаться за использование процессора. Область конкуренции потока устанавливается его атрибутным объектом.
Синопсис
#include
int pthread_attr_setscope(pthread_attr_t *attr,
int contentionscope);
int pthread_attr_getscope(
const pthread_attr_t *restrict_attr,
int *restrict contentionscope) ;
Функция pthread_attr_setscope() устанавливает член объекта атрибутов потока (заданного параметром attr), связанный с областью конкуренции. Область конкуренции потока будет установлена равной значению параметра contentionscope, который может принимать следующие значения.
PTHREAD_SCOPE_SYSTEM Область конкуренции системного уровня PTHREAD_SCOPE_PROCESS Область конкуренции уровня процесса
Функция pthread_attr_getscope() возвращает атрибут области конкуренции из объекта атрибутов потока, заданного параметром attr. При успешном выполнении значение области конкуренции сохраняется в параметре contentionscope. Обе функции при успешном выполнении возвращают число 0 , в противном случае — код ошибки-
Использование функции sysconf ()