param
sched_param, из которой параметры будут перенесены в атрибутную запись потока.Теперь посмотрим, как запустить на выполнение поток с приоритетом на 2 единицы ниже, чем у его родителя:
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
param sched_priority -= 2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setschedparam(&attr, ¶m);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_create(NULL, &attr, &func, NULL);
Или даже так (хотя это немного грубее):
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
pthread_attr_t attr;
pthread_attr_init(&attr);
attr.param.sched_priority = param.sched_priority - 2;
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_create(NULL, &attr, &func, NULL);
Как и при установке политики диспетчеризации, параметры диспетчеризации потока (и приоритет в их составе) будут установлены, только если параметр типа наследования от родителя установлен в PTHREAD_EXPLICIT_SCHED
pthread_attr_setinheritsched().Заметим здесь вскользь (в дальнейшем нам представится возможность использовать эти знания), что помимо «продуктивных» потоков (компонент системы и пользовательских приложений) в системе всегда существует один «паразитный» поток, запущенный с приоритетом 0 (idle-поток). Он «выбирает» весь остаток процессорного времени в те периоды, когда все имеющиеся в системе продуктивные потоки перейдут в блокированные состояния (ожидания). Подобная практика хорошо известна и реализуется также в большинстве других операционных систем.
Отличия от POSIX
Если следовать POSIX-стандарту, то некоторые из атрибутов невозможно переопределить до фактического создания этого стандарта (их можно изменить позже в самом коде потока, но иногда это не совсем правильное решение). Все эти возможности относятся к асинхронному завершению потока; детали функционирования этого механизма рассматриваются позже. К подобного рода атрибутам относятся:
• запретить асинхронное завершение (отмену) потока;
• установить тип завершаемости потока;
• определить, что должно происходить при доставке потоку сигналов.
QNX расширяет возможности POSIX, позволяя по условию OR установить соответствующие биты-флаги в поле flags
pthread_attr_set_*(), эквивалентных этим установкам. К этим флагам относятся:• PTHREAD_CANCEL_ENABLE
• PTHREAD_CANCEL_DISABLE
• PTHREAD_CANCEL_ASYNCHRONOUS
• PTHREAD_CANCEL_DEFERRED
• PTHREAD_MULTISIG_ALLOW
• PTHREAD_MULTISIG_DISALLOW
После запуска потока все атрибуты, связанные с завершаемостью потока, могут быть изменены вызовами pthread_setcancelstate()
pthread_setcanceltype().Передача параметров потоку
Зачастую каждый поток из группы последовательно создаваемых потоков, выполняющих одну и ту же функцию, нужно запускать со своим индивидуальным блоком данных (параметром потока). Для этого предназначен 4-й параметр вызова pthread_create()
void*. Характерно, что это может быть произвольная структура данных сколь угодно сложного типа, структуризацию которой вызывающий pthread_create() код и функция потока должны понимать единообразно; никакого контроля соответствия типов на этапе вызова не производится.