int *detachstate);

int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy);

int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int* policy);

int pthread_attr_setschedparam(pthread_attr_t *attr,

 const struct sched_param *param);

int pthread_attr_getschedparam(const pthread_attr_t *attr,

 struct sched_param *param);

int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);

int pthread_attr_getinheritsched(const pthread_attr_t *attr,

 int *inherit);

int pthread_attr_setscope(pthread_attr_t *attr, int scope);

int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);

int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);

int pthread_attr_getstacksize(const pthread_attr_t *attr, int* scope);

Как видите, существует лишь несколько атрибутов, которые вы можете применять, но к счастью у вас, как правило, не возникнет необходимости в использовании большинства из них.

□ detachedstate — этот атрибут позволяет избежать необходимости присоединения потоков (rejoin). Как и большинство этих функций с префиксом _set, эта функция принимает указатель на атрибут и флаг для определения требуемого состояния. Два возможных значения флага для функции attr_setdetachstatePTHREAD_CREATE_JOINABLE и PTHREAD_CREATE_DETACHED. По умолчанию у атрибута будет значение PTHREAD_CREATE_JOINABLE, поэтому вы сможете разрешить двум потокам объединяться (один ждет завершения другого). Если задать состояние PTHREAD_CREATE_DETACHED, вы не сможете вызвать функцию pthread_join, чтобы выяснить код завершения другого потока.

□ schedpolicy — этот атрибут управляет планированием потоков. Возможные значения — SCHED_OTHER, SCHED_RR и SCHED_FIFO. По умолчанию атрибут равен SCHED_OTHER. Два других типа планирования доступны только для процессов, выполняющихся с правами суперпользователя, поскольку они оба задают планирование в режиме реального времени, но с немного разным поведением. SCHED_RR использует круговую или циклическую схему планирования, a SCHED_FIFO — алгоритм "первым прибыл, первым обслужен". Оба эти алгоритма не обсуждаются в этой книге.

□ schedparam — это напарник атрибута schedpolicy и позволяет управлять планированием потоков, выполняющихся с типом планирования SCHED_OTHER. Мы рассмотрим пример его применения чуть позже в этой главе.

□ inheritsched — этот атрибут принимает одно из двух значений: PTHREAD_EXPLICIT_SCHED и PTHREAD_INHERIT_SCHED. По умолчанию значение атрибута PTHREAD_EXPLICIT_SCHED, что означает планирование, явно заданное атрибутами. Если задать PTHREAD_INHERIT_SCHED, новый поток будет вместо этого применять параметры, используемые потоком, создавшим его.

□ scope — этот атрибут управляет способом вычисления параметров планирования потока. Поскольку ОС Linux в настоящее время поддерживает единственное значение PTHREAD_SCOPE_SYSTEM, мы не будем рассматривать его в дальнейшем.

□ stacksize — этот атрибут управляет размером стека при создании потока, задается в байтах. Это часть необязательного раздела стандарта и поддерживается только в тех реализациях, у которых определено значение _PTHREAD_THREAD_ATTR_STACKSIZE. Linux по умолчанию реализует потоки со стеком большого размера, поэтому этот атрибут в ОС Linux избыточен.

Выполните упражнение 12.5.

Упражнение 12.5. Установка атрибута отсоединенного состояния

В примере с отсоединенным или обособленным потоком thread5.c вы создаете атрибут потока, задаете состояние потока как отсоединенное и затем создаете с помощью этого атрибута поток. Теперь, когда закончится дочерний поток, он вызовет обычным образом pthread_exit. В это время исходный поток больше не ждет созданный им поток для присоединения. В данном примере используется простой флаг thread_finished, чтобы позволить потоку main определить, закончился ли дочерний поток, и показать, что потоки все еще совместно используют переменные.

#include

#include

#include

#include

Перейти на страницу:

Похожие книги