- trixie 4.27.0-1
 - trixie-backports 4.28.0-2~bpo13+2
 - testing 4.28.0-2
 - unstable 4.28.0-2
 
| pthread_attr_init(3) | Library Functions Manual | pthread_attr_init(3) | 
НАИМЕНОВАНИЕ¶
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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
| 15 июня 2024 г. | Справочные страницы Linux 6.9.1 |