PTHREAD_INHERIT_SCHEDАтрибуты планирования потока должны быть унаследованы от потока-создателя, при этом любые атрибуты планирования, определяемые параметром attr, будут игнорироваться.
PTHREAD_EXPLICIT_SCHEDАтрибуты планирования потока должны быть установлены в соответствии с атрибутами планирования, хранимыми в объекте, заданном параметром attr.
Если параметр inheritsched получает значение PTHREAD_EXPLICIT_SCHED,то функция pthread_attr_setschedpolicy() используется для установки стратегии планирования, а функция pthread_attr_setschedparam() — установки приоритета.
Функция pthread_attr_setschedpolicy() устанавливает член объекта атрибутов потока (заданного параметром attr), «отвечающий» за стратегию планирования потока. Параметр policy может принимать одно из следующих значений, определенных в заголовке .
SCHED_FIFOСтратегия планирования типа FIFO (первым прибыл, первым обслужен), при которой поток выполняется до конца.
SCHED_RR Стратегия циклического планирования, при которой каждый поток
назначается процессору только в течение некоторого кванта времени- SCHED_OTHERСтратегия планирования другого типа (определяемая реализацией)-Для любого нового потока эта стратегия планирования принимается по умолчанию.
Функ ция pthread_attr_setschedparam() используется для установки членов атрибутного объекта (заданного параметром attr), связанных со стратегией планирования Параметр param представляет собой структуру, которая содержит эти члены. Структура sched_param включает по крайней мере такой член данных: struct sched_param {
int sched_priority;
//...
};
Возможно, эта структура содержит и другие члены данных, а также ряд функций, предназначенных для установки и считывания минимального и максимального значений приоритета, атрибутов планировщика и пр. Но если для задания стратегии планирования используется либо значение SCHED_FIFO,либо значение SCHED_RR,то в структуре sched_param достаточно определить только член sched_priority.
Чтобы получить минимальное и максимальное значения приоритета, используйте функции sched_get_priority_min () и sched_get_priority_max ().
Синопсис
#include
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
Обеим функциям в качестве параметра policy передается значение, определяющее выбранную стратегию планирования, для которой нужно установить значения приоритета, и обе функции возвращают соответствующее значение приоритета (минимальное и максимальное) для заданной стратегии планирования.
Как установить стратегию планирования и приоритет потока с помощью атрибутного объекта, показано в листинге 4.4.
// Листинг 4.4. Использование атрибутного объекта потока И для установки стратегии планирования и
II приоритета потока
#define Min_Stack_Req 3000000
pthread_t ThreadA;
pthread_attr_t SchedAttr;
size_t DefaultSize,SizeOffset,NewSize;
int MinPriority,MaxPriority,MidPriority;
sched_param SchedParam;
int main(int argc, char *argv[])
{
//...
// initialize attribute object
pthread_attr_init(&SchedAttr);
// retrieve min and max priority values for scheduling policy
MinPriority = sched_get_priority_max(SCHED_RR);
MaxPriority = sched_get_priority_min(SCHED_RR);
// calculate priority value
MidPriority = (MaxPriority + MinPriority)/2;
// assign priority value to sched_param structure
SchedParam.sched_priority = MidPriority;
// set attribute object with scheduling parameter
pthread_attr_setschedparam(&Attr1,&SchedParam);
// set scheduling attributes to be determined by attribute object
pthread_attr_setinheritsched(&Attr1,PTHREAD_EXPLICIT_SCHED);
// set scheduling policy
pthread_attr_setschedpolicy(&Attr1,SCHED_RR);
// create thread with scheduling attribute object
pthread_create(&ThreadA,&Attr1,task2,Value);
}
В листинге 4.4 стратегия планирования и приоритет потока ThreadAустанавливаются с использованием атрибутного объекта SchedAttr.Выполним следующие действия.
1. Инициализируем атрибутный объект.
2. Считаем минимальное и максимальное значения приоритета для стратегии планирования.
3. Вычислим значение приоритета.
4. Запишем значение приоритета в структуру sched_param.
5. Установим атрибутный объект.
6. Обеспечим установку атрибутов планирования с помощью атрибутного объекта.
7. Установим стратегию планирования.
8. Создадим поток с помощью атрибутного объекта.
Последовательное выполнение этих действий позволяет установить стратегию планирования и приоритет потока до его создания. Для динамического изменения стратегии планирования и приоритета используйте функции pthread_setschedparam() и pthread_setschedprio().
Читать дальше