next up previous contents
Next: Размер стека в потоке Up: Атрибуты потоков Previous: Ограничения потока   Contents

Дисциплина планирования потока

Стандарт POSIX определяет несколько значений атрибута планирования: SCHED_FIFO, SCHED_RR (Round Robin) или SCHED_OTHER (метод приложения). Дисциплины SCHED_FIFO и SCHED_RR являются необязательными и поддерживаются только для потоков в режиме реального времени.

Библиотека pthreads поддерживает только значение SCHED_OTHER. Попытка установить другое значение приведет к возникновению ошибки ENOSUP.

Для установки дисциплины диспетчеризации используется следующая функция:

#include <pthread.h>

pthread_attr_t tattr;

int ret;

ret = pthread_attr_setschedpolicy(&tattr, SCHED_OTHER);

Парной к ней является функция pthread_attr_getschedpolicy(), которая возвращает константу, определяющую дисциплину диспетчеризации.

Функция pthread_attr_setinheritsched() используется для наследования дисциплины диспетчеризации из родительского потока. Значение переменной inherit, равное PTHREAD_INHERIT_SCHED (по умолчанию) проявляется в том, что будет использована дисциплина планирования, определенная в создающем потоке, а любые атрибуты планирования, определенные в вызове pthread_create(), будут проигнорированы. Если используется константа
PTHREAD_EXPLICIT_SCHED, то используются и атрибуты, переданные в вызове pthread_create().

Функция возвращает 0 - при успешном завершении - и любое другое значение - в случае ошибки. Пример вызова этой функции:

#include <pthread.h>

pthread_attr_t tattr;

int ret;

ret = pthread_attr_setinheritsched(&tattr,

      PTHREAD_EXPLICIT_SCHED);

Функцию pthread_attr_getinheritsched(pthread_attr_t *tattr, int *inherit) можно использовать для получения информации о дисциплине планирования текущего потока.

Параметры диспетчеризации определены в структуре
sched_param; в настоящее время поддерживается только приоритет
sched_param.sched_priority. Этот приоритет задается целым числом, при этом чем выше значение, тем выше приоритет потока при планировании. Создаваемые потоки получают этот приоритет.

Функция pthread_attr_setschedparam() используется, чтобы установить значения в этой структуре. При успешном завершении она возвращает 0. Пример использования:

#include <pthread.h>

pthread_attr_t tattr;

int newprio;

sched_param param;

/* устанавливает приоритет */

newprio = 30;

param.sched_priority = newprio;

/* устанавливает параметры диспетчеризации */

ret = pthread_attr_setschedparam (&tattr, &param);

Функция pthread_attr_getschedparam (pthread_attr_t *tattr,

const struct sched_param *param) используется для получения приоритета текущего потока.



2004-06-22