Атрибуты являются способом определить поведение потока, отличное от
поведения по умолчанию. При создании потока с помощью pthread_create()
или при инициализации переменной синхронизации может быть определен
собственный объект атрибутов. Атрибуты определяются только во время
создания потока; они не могут быть изменены в процессе использования.
Обычно вызываются три функции:
инициализация атрибутов потока - pthread_attr_init() - создает
объект pthread_attr_ttattr по умолчанию;
изменение значений атрибутов (если значения по умолчанию не подходят)
- разнообразные функции pthread_attr_*(), позволяющие
установить значения индивидуальных атрибутов для структуры pthread_attr_ttattr;
создание потока вызовом pthread_create() с соответствующими
значениями атрибутов в структуре pthread_attr_ttattr.
Пример кода, выполняющего эти действия:
#include <pthread.h>
pthread_attr_t tattr;
pthread_t tid;
void *start_routine;
void arg
int ret;
/* инициализация атрибутами по умолчанию */
ret = pthread_attr_init(&tattr);
/* вызов соответствующих функций для изменения
значений */
ret = pthread_attr_*(&tattr,
SOME_ATRIBUTE_VALUE_PARAMETER);
/* создание потока */
ret = pthread_create(&tid, &tattr, start_routine, arg);
Объект атрибутов является закрытым и не может быть непосредственно
изменен операциями присваивания. Существует множество функций, позволяющих
инициализировать, конфигурировать и уничтожать любые типы объекта.
Как только атрибут инициализируется и конфигурируется, он доступен
всему процессу. Поэтому рекомендуется конфигурировать все требуемые
спецификации состояния один раз, на ранних стадиях выполнения программы.
При этом соответствующий объект атрибутов может использоваться везде,
где это нужно. Использование объектов атрибутов имеет два основных
преимущества.
Во-первых, обеспечивается мобильность кода. Даже в случае, когда
поддерживаемые атрибуты могут измениться в зависимости от реализации,
не нужно будет изменять вызовы функций, которые создают объекты потоков,
потому что объект атрибутов скрыт от интерфейса. Если целевая система
поддерживает атрибуты, отсутствующие в текущей системе, должны быть
созданы условия для управления новыми атрибутами. Задача портирования
облегчается, потому что объекты атрибутов будут инициализироваться
однажды и в определенном месте.
Во-вторых, упрощается спецификация состояний в приложении. Пусть в
пределах процесса существует несколько множеств потоков, при этом
каждое обеспечивает отдельный сервис, и имеет свои собственные требования
к состоянию. В некоторый момент на ранних стадиях приложения, можно
инициализировать объект атрибутов потока для каждого множества. Все
будущие вызовы создания потока будут обращаться к объекту атрибутов,
инициализированному для этого типа потока. Стадия инициализации будет
простой и локализованной, и любые возможные модификации можно
сделать быстро и надежно.
Объекты атрибутов требуют отдельного внимания во время выхода из процесса.
Когда объект инициализируется, для него выделяется память. Эта память
должна быть возвращена системе. Стандарт pthreads обеспечивает
функции для удаления объектов атрибутов.
Функция pthread_attr_init() используется, чтобы инициализировать
объект атрибутов значениями по умолчанию. Память распределяется системой
потоков во время выполнения.
Пример вызова функции:
#include <pthread.h>
pthread_attr_t tattr;
int ret;
ret = pthread_attr_init(&tattr);
Значения по умолчанию для атрибутов (tattr) приведены в табл.
5.
Таблица 5. Атрибуты потока по умолчанию
Атрибут
Значение
Смысл
scope
PTHREAD_SCOPE_PROCESS
Новый поток не ограничен - не присоединен ни к одному процессу
detachstate
PTHREAD_CREATE_JOINABLE
Статус выхода и поток сохраняются после завершения потока
stackaddr
NULL
Новый поток получает адрес стека, выделенного системой
stacksize
1 Мбайт
Новый поток имеет размер стека, определенный системой
Новый поток использует диспетчеризацию с фиксированными приоритетами.
Поток работает, пока не будет прерван потоком с высшим приоритетом
или не приостановится
Функция возвращает 0 после успешного завершения. Любое другое значение
указывает, что произошла ошибка. Код ошибки устанавливается в переменной
errno.
Функция pthread_attr_destroy() используется, чтобы удалить
память для атрибутов, выделенную во время инициализации. Объект атрибутов
становится недействительным.
Пример вызова функции:
#include <pthread.h>
pthread_attr_t tattr;
int ret;
ret = pthread_attr_destroy(&tattr);
pthread_attr_destroy() возвращает 0 - после успешного завершения -
или любое другое значение - в случае ошибки.
Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке,
посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных
администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости
индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.
Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из
первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную
версию журнала в pdf-формате.
Подробнее о проведении акции вы можете прочитать на
странице сайта.