Стандарт 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) используется для получения приоритета текущего потока.