pthread_attr_setstack(3)

изменяет/возвращает атрибуты стека из объекта атрибутов нити · man3 · Русский

pthread_attr_setstack(3) Library Functions Manual pthread_attr_setstack(3)

pthread_attr_setstack, pthread_attr_getstack - изменяет/возвращает атрибуты стека из объекта атрибутов нити

POSIX threads library (libpthread, -lpthread)

#include <pthread.h>
int pthread_attr_setstack(pthread_attr_t *attr,
                          void stackaddr[.stacksize],
                          size_t stacksize);
int pthread_attr_getstack(const pthread_attr_t *restrict attr,
                          void **restrict stackaddr,
                          size_t *restrict stacksize);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

pthread_attr_getstack(), pthread_attr_setstack():

_POSIX_C_SOURCE >= 200112L

Функция pthread_attr_setstack() изменяет атрибуты адреса и размера стека в объекте атрибутов нити, на который указывает attr, на значения, задаваемые в stackaddr и stacksize, соответственно. Данными атрибутами задаёт расположение и размер стека, который будет использоваться нитью, создаваемой с использованием объекта атрибутов нити attr.

Значение stackaddr должно указывать на самый младший адресуемый байт буфера из stacksize байт, выделенного вызывающим. Страницы выделенного буфера должны быть доступны на чтение и запись.

Функция pthread_attr_getstack() возвращает атрибуты адреса и размера стека из объекта атрибутов нити, на который указывает attr, в буфер, на который указывает stackaddr и stacksize, соответственно.

При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.

Функция pthread_attr_setstack() может завершиться со следующей ошибкой:

stacksize is less than PTHREAD_STACK_MIN (16384) bytes. On some systems, this error may also occur if stackaddr or stackaddr + stacksize is not suitably aligned.

В POSIX.1 также описана ошибка EACCES, которая возникает, если область стека, определённая stackaddr и stacksize, недоступна вызывающему на чтение и запись.

These functions are provided since glibc 2.2.

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
pthread_attr_setstack(), pthread_attr_getstack() Безвредность в нитях MT-Safe

POSIX.1-2001, POSIX.1-2008.

Эти функции нужны приложениям, в которых нужно размещать стек в определённом месте. В большинстве приложений это не нужно и эти функции использовать не стоит (используйте pthread_attr_setstacksize(3), если приложению нужно задать только размер стека, отличный от умолчательного).

Когда приложение использует pthread_attr_setstack(), оно самостоятельно выделяет место под стек. Защитный размер, задаваемый pthread_attr_setguardsize(3), игнорируется. Если его учитывать необходимо, то приложение должно самостоятельно выделять защитную область (одну или несколько страниц, защищённых от чтения и записи) для обработки возможного переполнения стека.

Адрес, указанный в stackaddr, должен быть выровнен соответствующим образом: для полной переносимости выравнивайте его по границе страницы (sysconf(_SC_PAGESIZE)). Для выделения полезно использовать функцию posix_memalign(3)EN. Вероятно, значение stacksize также должно быть кратно размеру системной страницы.

Если attr используется при создании нескольких нитей, то вызывающий должен изменять атрибут адреса стека между вызовами pthread_create(3)EN; в противном случае нити будут пытаться использовать одну и ту же область памяти для стека и возникнет хаос.

Смотрите pthread_attr_init(3)EN.

mmap(2), mprotect(2), posix_memalign(3)EN, pthread_attr_init(3)EN, pthread_attr_setguardsize(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3)EN, pthreads(7)

Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Kogan, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 декабря 2022 г. Linux man-pages 6.03