.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pthread_attr_init 3 "2 мая 2024 г." "Linux man\-pages 6.8" .SH ИМЯ pthread_attr_init, pthread_attr_destroy \- инициализирует и уничтожает объект атрибутов нити .SH LIBRARY POSIX threads library (\fIlibpthread\fP, \fI\-lpthread\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBint pthread_attr_init(pthread_attr_t *\fP\fIattr\fP\fB);\fP \fBint pthread_attr_destroy(pthread_attr_t *\fP\fIattr\fP\fB);\fP .fi .SH ОПИСАНИЕ Функция \fBpthread_attr_init\fP() инициализирует объект атрибутов нити, на который указывает \fIattr\fP, значениями атрибутов по умолчанию. После этого вызова отдельные атрибуты объекта можно изменять с помощью различных соответствующих функций (перечислены в разделе СМОТРИТЕ ТАКЖЕ, а после этого объект можно использовать в одном или нескольких вызовах \fBpthread_create\fP(3) для создания нитей. .P Вызов \fBpthread_attr_init\fP() с уже инициализированным объектом атрибутов нити приводит к непредсказуемому поведению. .P Когда объект атрибутов нити больше не нужен, он должен быть уничтожен с помощью функции \fBpthread_attr_destroy\fP(). Уничтожение объекта атрибутов нити не влияет на нить, которая была создана с использованием этого объекта. .P После уничтожения объекта атрибутов нити его можно инициализировать с помощью \fBpthread_attr_init\fP() повторно. При использовании уничтоженного объекта атрибутов нити другим способом приводит непредсказуемым результатам. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки. .SH ОШИБКИ В POSIX.1 описана ошибка \fBENOMEM\fP для \fBpthread_attr_init\fP(); в Linux эти функции всегда выполняются успешно (тем не менее, в переносимых приложениях нужно учитывать возможность возврата ошибки). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBpthread_attr_init\fP(), \fBpthread_attr_destroy\fP() T} Безвредность в нитях MT\-Safe .TE .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ POSIX.1\-2001. .SH ПРИМЕЧАНИЯ Тип \fIpthread_attr_t\fP должен считаться со скрытым форматом: любой доступ к объекту помимо функций pthreads является непереносимым и приводит к непредсказуемым результатам. .SH ПРИМЕРЫ В программе, представленной ниже, для создания одной нити используется \fBpthread_attr_init\fP() и другие функции, относящиеся к инициализации объекта атрибутов нити. После создания в нити используется функция \fBpthread_getattr_np\fP(3) (нестандартное расширение GNU) для получения атрибутов нити, а затем показываются эти атрибуты. .P Если программа запускается без аргументов командной строки, то аргумент \fIattr\fP функции \fBpthread_create\fP(3) равен NULL, и поэтому нить создаётся с атрибутами по умолчанию. При запуске программы на Linux/x86\-32 с реализацией нитей NPTL мы увидим следующее: .P .in +4n .EX .\" Results from glibc 2.8, SUSE 11.0; Oct 2008 $\fB ulimit \-s\fP # стек не ограничен ==> размер стека по умолчанию 2 МБ unlimited $\fB ./a.out\fP Атрибуты нити: Состояние отсоединения = PTHREAD_CREATE_JOINABLE Область = PTHREAD_SCOPE_SYSTEM Унаследованный планировщик = PTHREAD_INHERIT_SCHED Алгоритм планирования = SCHED_OTHER Приоритет планирования = 0 Размер защиты = 4096 байт Адрес стека = 0x40196000 Размер стека = 0x201000 байт .EE .in .P Если в командной строке мы укажем размер стека, то программа инициализирует объект атрибутов нити, задаёт различные атрибуты в этом объекте и передаёт указатель на объект в вызов \fBpthread_create\fP(3). При запуске программы на Linux/x86\-32 с реализацией нитей NPTL мы увидим следующее: .P .in +4n .EX .\" Results from glibc 2.8, SUSE 11.0; Oct 2008 $\fB ./a.out 0x3000000\fP posix_memalign() выделен по адресу 0x40197000 Атрибуты нити: Состояние отсоединения = PTHREAD_CREATE_DETACHED Область = PTHREAD_SCOPE_SYSTEM Унаследованный планировщик = PTHREAD_EXPLICIT_SCHED Алгоритм планирования = SCHED_OTHER Приоритет планирования = 0 Размер защиты = 0 байт Адрес стека = 0x40197000 Размер стека = 0x3000000 байт .EE .in .SS "Исходный код программы" .\" SRC BEGIN (pthread_attr_init.c) \& .EX #define _GNU_SOURCE /* To get pthread_getattr_np() declaration */ #include #include #include #include #include #include \& 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\en", 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\en", 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\en", 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\en", 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\en", 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\en", prefix, v); \& s = pthread_attr_getstack(attr, &stkaddr, &v); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_getstack"); printf("%sStack address = %p\en", prefix, stkaddr); printf("%sStack size = %#zx bytes\en", 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:\en"); display_pthread_attr(&gattr, "\et"); \& 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\en", 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() */ } .EE .\" SRC END .SH "СМОТРИТЕ ТАКЖЕ" .ad l .nh \fBpthread_attr_setaffinity_np\fP(3), \fBpthread_attr_setdetachstate\fP(3), \fBpthread_attr_setguardsize\fP(3), \fBpthread_attr_setinheritsched\fP(3), \fBpthread_attr_setschedparam\fP(3), \fBpthread_attr_setschedpolicy\fP(3), \fBpthread_attr_setscope\fP(3), \fBpthread_attr_setsigmask_np\fP(3), \fBpthread_attr_setstack\fP(3), \fBpthread_attr_setstackaddr\fP(3), \fBpthread_attr_setstacksize\fP(3), \fBpthread_create\fP(3), \fBpthread_getattr_np\fP(3), \fBpthread_setattr_default_np\fP(3), \fBpthreads\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал Alexey, Azamat Hackimov , kogamatranslator49 , Darima Kogan , Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .