Provided by: manpages-ru-dev_4.26.0-1_all 

НАИМЕНОВАНИЕ
pthread_attr_init, pthread_attr_destroy - инициализирует и уничтожает объект атрибутов нити
БИБЛИОТЕКА
Библиотека потоков POSIX (libpthread, -lpthread)
ОБЗОР
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
ОПИСАНИЕ
Функция pthread_attr_init() инициализирует объект атрибутов нити, на который указывает attr, значениями
атрибутов по умолчанию. После этого вызова отдельные атрибуты объекта можно изменять с помощью различных
соответствующих функций (перечислены в разделе СМОТРИТЕ ТАКЖЕ, а после этого объект можно использовать в
одном или нескольких вызовах pthread_create(3) для создания нитей.
Вызов pthread_attr_init() с уже инициализированным объектом атрибутов нити приводит к непредсказуемому
поведению.
Когда объект атрибутов нити больше не нужен, он должен быть уничтожен с помощью функции
pthread_attr_destroy(). Уничтожение объекта атрибутов нити не влияет на нить, которая была создана с
использованием этого объекта.
После уничтожения объекта атрибутов нити его можно инициализировать с помощью pthread_attr_init()
повторно. При использовании уничтоженного объекта атрибутов нити другим способом приводит непредсказуемым
результатам.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.
ОШИБКИ
В POSIX.1 описана ошибка ENOMEM для pthread_attr_init(); в Linux эти функции всегда выполняются успешно
(тем не менее, в переносимых приложениях нужно учитывать возможность возврата ошибки).
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
┌─────────────────────────────────────────────────────────────────────┬──────────────────────┬──────────┐
│ Интерфейс │ Атрибут │ Значение │
├─────────────────────────────────────────────────────────────────────┼──────────────────────┼──────────┤
│ pthread_attr_init(), pthread_attr_destroy() │ Безвредность в нитях │ MT-Safe │
└─────────────────────────────────────────────────────────────────────┴──────────────────────┴──────────┘
СТАНДАРТЫ
POSIX.1-2008.
ИСТОРИЯ
POSIX.1-2001.
ПРИМЕЧАНИЯ
Тип pthread_attr_t должен считаться со скрытым форматом: любой доступ к объекту помимо функций pthreads
является непереносимым и приводит к непредсказуемым результатам.
ПРИМЕРЫ
В программе, представленной ниже, для создания одной нити используется pthread_attr_init() и другие
функции, относящиеся к инициализации объекта атрибутов нити. После создания в нити используется функция
pthread_getattr_np(3) (нестандартное расширение GNU) для получения атрибутов нити, а затем показываются
эти атрибуты.
Если программа запускается без аргументов командной строки, то аргумент attr функции pthread_create(3)
равен NULL, и поэтому нить создаётся с атрибутами по умолчанию. При запуске программы на Linux/x86-32 с
реализацией нитей NPTL мы увидим следующее:
$ ulimit -s # стек не ограничен ==> размер стека по умолчанию 2 МБ
unlimited
$ ./a.out
Атрибуты нити:
Состояние отсоединения = PTHREAD_CREATE_JOINABLE
Область = PTHREAD_SCOPE_SYSTEM
Унаследованный планировщик = PTHREAD_INHERIT_SCHED
Алгоритм планирования = SCHED_OTHER
Приоритет планирования = 0
Размер защиты = 4096 байт
Адрес стека = 0x40196000
Размер стека = 0x201000 байт
Если в командной строке мы укажем размер стека, то программа инициализирует объект атрибутов нити, задаёт
различные атрибуты в этом объекте и передаёт указатель на объект в вызов pthread_create(3). При запуске
программы на Linux/x86-32 с реализацией нитей NPTL мы увидим следующее:
$ ./a.out 0x3000000
posix_memalign() выделен по адресу 0x40197000
Атрибуты нити:
Состояние отсоединения = PTHREAD_CREATE_DETACHED
Область = PTHREAD_SCOPE_SYSTEM
Унаследованный планировщик = PTHREAD_EXPLICIT_SCHED
Алгоритм планирования = SCHED_OTHER
Приоритет планирования = 0
Размер защиты = 0 байт
Адрес стека = 0x40197000
Размер стека = 0x3000000 байт
Исходный код программы
#define _GNU_SOURCE /* To get pthread_getattr_np() declaration */
#include <err.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
display_pthread_attr(pthread_attr_t *attr, char *prefix)
{
int s, i;
size_t v;
void *stkaddr;
struct sched_param sp;
s = pthread_attr_getdetachstate(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getdetachstate");
printf("%sDetach state = %s\n", prefix,
(i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
(i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
"???");
s = pthread_attr_getscope(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getscope");
printf("%sScope = %s\n", prefix,
(i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" :
(i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
"???");
s = pthread_attr_getinheritsched(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getinheritsched");
printf("%sInherit scheduler = %s\n", prefix,
(i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" :
(i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
"???");
s = pthread_attr_getschedpolicy(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getschedpolicy");
printf("%sScheduling policy = %s\n", prefix,
(i == SCHED_OTHER) ? "SCHED_OTHER" :
(i == SCHED_FIFO) ? "SCHED_FIFO" :
(i == SCHED_RR) ? "SCHED_RR" :
"???");
s = pthread_attr_getschedparam(attr, &sp);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getschedparam");
printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);
s = pthread_attr_getguardsize(attr, &v);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getguardsize");
printf("%sGuard size = %zu bytes\n", prefix, v);
s = pthread_attr_getstack(attr, &stkaddr, &v);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getstack");
printf("%sStack address = %p\n", prefix, stkaddr);
printf("%sStack size = %#zx bytes\n", prefix, v);
}
static void *
thread_start(void *arg)
{
int s;
pthread_attr_t gattr;
/* pthread_getattr_np() is a non-standard GNU extension that
retrieves the attributes of the thread specified in its
first argument. */
s = pthread_getattr_np(pthread_self(), &gattr);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_getattr_np");
printf("Thread attributes:\n");
display_pthread_attr(&gattr, "\t");
exit(EXIT_SUCCESS); /* Terminate all threads */
}
int
main(int argc, char *argv[])
{
pthread_t thr;
pthread_attr_t attr;
pthread_attr_t *attrp; /* NULL or &attr */
int s;
attrp = NULL;
/* If a command-line argument was supplied, use it to set the
stack-size attribute and set a few other thread attributes,
and set attrp pointing to thread attributes object. */
if (argc > 1) {
size_t stack_size;
void *sp;
attrp = &attr;
s = pthread_attr_init(&attr);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_init");
s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setdetachstate");
s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setinheritsched");
stack_size = strtoul(argv[1], NULL, 0);
s = posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);
if (s != 0)
errc(EXIT_FAILURE, s, "posix_memalign");
printf("posix_memalign() allocated at %p\n", sp);
s = pthread_attr_setstack(&attr, sp, stack_size);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setstack");
}
s = pthread_create(&thr, attrp, &thread_start, NULL);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_create");
if (attrp != NULL) {
s = pthread_attr_destroy(attrp);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_destroy");
}
pause(); /* Terminates when other thread calls exit() */
}
СМОТРИТЕ ТАКЖЕ
pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3),
pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3),
pthread_attr_setscope(3), pthread_attr_setsigmask_np(3), pthread_attr_setstack(3),
pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthread_getattr_np(3),
pthread_setattr_default_np(3), pthreads(7)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Alexey, Azamat Hackimov
<azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Darima Kogan
<silverdk99@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов
<pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 15 июня 2024 г. pthread_attr_init(3)