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);
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() может
завершиться
со
следующей
ошибкой:
- EINVAL
-
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).
Вероятно,
значение
stacksize также
должно
быть
кратно
размеру
системной
страницы.
Если
attr
используется
при
создании
нескольких
нитей, то
вызывающий
должен
изменять
атрибут
адреса
стека
между
вызовами
pthread_create(3); в
противном
случае
нити будут
пытаться
использовать
одну и ту же
область
памяти для
стека и
возникнет
хаос.
Смотрите
pthread_attr_init(3).
mmap(2),
mprotect(2),
posix_memalign(3),
pthread_attr_init(3),
pthread_attr_setguardsize(3),
pthread_attr_setstackaddr(3),
pthread_attr_setstacksize(3),
pthread_create(3),
pthreads(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexey, Azamat Hackimov <
[email protected]>, kogamatranslator49
<
[email protected]>, Kogan, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]