Атрибуты являются способом определить поведение потока, отличное от поведения по умолчанию. При создании потока с помощью pthread_create() или при инициализации переменной синхронизации может быть определен собственный объект атрибутов. Атрибуты определяются только во время создания потока; они не могут быть изменены в процессе использования.
Обычно вызываются три функции:
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);
Объект атрибутов является закрытым и не может быть непосредственно изменен операциями присваивания. Существует множество функций, позволяющих инициализировать, конфигурировать и уничтожать любые типы объекта. Как только атрибут инициализируется и конфигурируется, он доступен всему процессу. Поэтому рекомендуется конфигурировать все требуемые спецификации состояния один раз, на ранних стадиях выполнения программы. При этом соответствующий объект атрибутов может использоваться везде, где это нужно. Использование объектов атрибутов имеет два основных преимущества.
Функция pthread_attr_init() используется, чтобы инициализировать объект атрибутов значениями по умолчанию. Память распределяется системой потоков во время выполнения.
Пример вызова функции:
pthread_attr_t tattr;
int ret;
ret = pthread_attr_init(&tattr);
Атрибут | Значение | Смысл |
scope | PTHREAD_SCOPE_PROCESS | Новый поток не ограничен - не присоединен ни к одному процессу |
detachstate | PTHREAD_CREATE_JOINABLE | Статус выхода и поток сохраняются после завершения потока |
stackaddr | NULL | Новый поток получает адрес стека, выделенного системой |
stacksize | 1 Мбайт | Новый поток имеет размер стека, определенный системой |
inheritsched | PTHREAD_INHERIT_SCHED | Поток наследует приоритет диспетчеризации родительского потока |
schedpolicy | SCHED_OTHER | Новый поток использует диспетчеризацию с фиксированными приоритетами. Поток работает, пока не будет прерван потоком с высшим приоритетом или не приостановится |
Функция возвращает 0 после успешного завершения. Любое другое значение указывает, что произошла ошибка. Код ошибки устанавливается в переменной errno.
Функция pthread_attr_destroy() используется, чтобы удалить память для атрибутов, выделенную во время инициализации. Объект атрибутов становится недействительным.
Пример вызова функции:
pthread_attr_t tattr;
int ret;
ret = pthread_attr_destroy(&tattr);