Стандарт POSIX определяет несколько значений атрибута планирования: SCHED_FIFO, SCHED_RR (Round Robin) или SCHED_OTHER (метод приложения). Дисциплины SCHED_FIFO и SCHED_RR являются необязательными и поддерживаются только для потоков в режиме реального времени.
Библиотека pthreads поддерживает только значение SCHED_OTHER. Попытка установить другое значение приведет к возникновению ошибки ENOSUP.
Для установки дисциплины диспетчеризации используется следующая функция:
pthread_attr_t tattr;
int ret;
ret = pthread_attr_setschedpolicy(&tattr, SCHED_OTHER);
Функция pthread_attr_setinheritsched() используется для
наследования дисциплины диспетчеризации из родительского потока. Значение
переменной inherit, равное PTHREAD_INHERIT_SCHED
(по умолчанию) проявляется в том, что будет использована дисциплина планирования,
определенная в создающем потоке, а любые атрибуты планирования, определенные
в вызове pthread_create(), будут проигнорированы. Если используется
константа
PTHREAD_EXPLICIT_SCHED, то используются и атрибуты,
переданные в вызове pthread_create().
Функция возвращает 0 - при успешном завершении - и любое другое значение - в случае ошибки. Пример вызова этой функции:
pthread_attr_t tattr;
int ret;
ret = pthread_attr_setinheritsched(&tattr,
PTHREAD_EXPLICIT_SCHED);
Параметры диспетчеризации определены в структуре
sched_param;
в настоящее время поддерживается только приоритет
sched_param.sched_priority.
Этот приоритет задается целым числом, при этом чем выше значение,
тем выше приоритет потока при планировании. Создаваемые потоки получают
этот приоритет.
Функция pthread_attr_setschedparam() используется, чтобы установить значения в этой структуре. При успешном завершении она возвращает 0. Пример использования:
pthread_attr_t tattr;
int newprio;
sched_param param;
/* устанавливает приоритет */
newprio = 30;
param.sched_priority = newprio;
/* устанавливает параметры диспетчеризации */
ret = pthread_attr_setschedparam (&tattr, ¶m);
const struct sched_param *param) используется для получения приоритета текущего потока.