Параллельное и распределенное программирование на С++ - Хьюз Камерон
Шрифт:
Интервал:
Закладка:
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширением POSIX Threads Extension.
Issue 6
Функции pthread_attr_getdetachstate() и pthread_attr_setdetachstate () от м ечены как часть опции Threads.
Раздел «Описание» был отредактирован с целью исключить из него слово «must» («должен»).
pthread_attr_getguardsize, pthread_attr_setguardsize
Имя
pthread_attr_getguardsize, pthread_attr_setguardsize— функции считывания и установки значения потоково г о атрибута guardsize.
Синопсис
XSI #include <pthread.h>
int pthread_attr_getguardsize (
const pthread_attr_t *restrict attr, size_t *restrict guardsize);
int pthread_attr_setguardsize (pthread_attr_t *attr,
size_t guardsize);
Описание
Функция pthread_attr_getguardsize () используется для считывания атрибута guardsize из объекта атрибутов, адресуе м ого пара м етро м attr. Этот атрибут возвращается в пара м етре guardsize.
Функция pthread_attr_setguardsize () позволяет установить атрибут guardsize в объекте атрибутов, адресуемом параметром аttr. Новое значение этого атрибута записывается из пара м етра guardsize. Если значение пара м етра guardsize равно нулю, то для потоков, создавае м ых с использование м атрибута attr, защищенная область не предоставляется. Если значение пара м етра guardsize больше нуля, то для каждого потока, создавае м ого с использование м атрибута attr, предоставляется защищенная область, раз м ер которой составляет не м енее guardsize байтов.
Атрибут guardsize позволяет управлять размером защищенной области, выделяемой для стека создаваемого потока. Атрибут guardsize обеспечивает защиту от адресного переполнения указателя стека. Если стек создается с использование м такой защиты, реализация выделяет дополнительную па м ять в конце области переполнения стека, которая служит специальным буфером. Если приложение переполняет стек, входя в этот буфер, формируется сигнал ошибки (возможно, в сигнале SIGSEGV, передаваемом потоку).
Реализация может округлить значение, содержащееся в атрибуте guardsize, до числа, кратного значению реконфигурируемой системной переменной {PAGESIZE} (см. заголовок <sys/mman.h>). Если реализация округлит значение атрибута guardsize до числа, кратного значению пере м енной {PAGESIZE}, то при вызове функции pthread_attr_getguardsize () с заданным параметром attr в пара м етре guardsize сохранится размер защитной области, установленный в результате предварительного вызова функции pthread_attr_setguardsize ().
По у м олчанию значение атрибута guardsize равно {PAGESIZE} байтам. Реальное значение пере м енной {PAGESIZE} определяется реализацией.
Если предварительно был установлен атрибут stackaddr или stack (т.е. инициатор вызова са м остоятельно выделяет па м ять для стеков потока и управляет этой па м ятью), то атрибут guardsize игнорируется, и никакая защита от переполнения стека потока реализацией не обеспечивается. Вся ответственность в этом случае за управление памятью стека лежит на приложении.
Возвращаемые значения
При успешно м завершении функции pthread_attr_getguardsize() и pthread_attr_setguardsize() возвращают нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Ошибки
Функция pthread_attr_getguardsize () завершится неудачно, если:
[EINVAL ] значение, заданное пара м етро м guardsi ze, недействительно;
[ EINVAL ] значение пара м етра аttr недействительно.
Эти функции не возвращают код ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
Отсутствует.
Логическое обоснование
Атрибут guardsize предла г ается для испо л ьзования при л ожение м по дву м причина м.
1. На защиту от переполнения могут потенциально затрачиваться существенные системные ресурсы. Для приложения, в котором создается большое количество потоков и существует уверенность в том, что при выполнении потоков их стеки никогда не будут переполнены, можно сэкономить системные ресурсы, отключив выделение областей защиты.
2. Если потоки размещают в стеке большие структуры данных, то для обнаружения факта переполнения стека могут понадобиться области защиты большого объема.
Будущие направления
Отсутствуют.
Смотри также
То м Base Definitions стандарта IEEE Std 1003.1-2001.
<pthread.h> , <sys/mman.h>.
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5.
Issue 6
Из раздела «Ошибки» было удалено третье условие возникновения ошибки [EINVAL] , поскольку оно включается во второе условие.
В целях согласования со стандарто м ISO/IEC 9899: 1999 в прототип функции pthread_attr_getguardsize () было добавлено ключевое слово restrict.
pthread_attr_getinheritsched, pthread_attr_setinheritsched
Имя
pthread_attr_getinheritsched, pthread_attr_setinheritsched— функции считывания и установки атрибута inheritsched (REALTIME THREADS).
Синопсис
THRTPS #include <pthread.h>
int pthread_attr_getinheritsched (
const pthread_attr_t *restrict attr, int *restrict inheritsched);
int pthread_attr_setinheritsched (pthread_attr_t *attr,
int inheritsched);
Описание
Функции pthread_attr_getinheritsched() и pthread_attr_setinheritsched() используются для считывания и установки соответственно атрибута inheri tsched в объекте, заданно м пара м етро м аttr.
Если при вызове функции pthread_create () используются объекты атрибутов, то атрибут inheritsched определяет, как будут устанавливаться другие атрибуты планирования создавае м ого потока.
Значение PTHREAD_INHERIT_SCHED говорит о то м, что атрибуты планирования потоков наследуются от создающего потока, а атрибуты планирования, содержащиеся в объекте, заданно м пара м етро м attr, игнорируются.
Значение PTHREAD_EXPLICIT_SCHED подразу м евает, что атрибуты планирования потоков устанавливаются равны м и соответствующи м значения м, содержащи м ся в объекте атрибутов, заданно м пара м етро м attr.
Значения PTHREAD_INHERIT_SCHED и PTHREAD_EXPLICIT_SCHED определяются в заголовке <pthread. h>.
От значения атрибута inheritsched зависят следующие атрибуты планирования потоков, определенные стандарто м IEEE Std ЮОЗ.1-2001: стратегия планирования (schedpolicy), пара м етры планирования (schedparam) и область конкуренции (contentionscope).
Возвращаемые значения
При успешно м завершении функции pthread_attr_getinheritsched() Hpthread_attr_setinheritsched() возвращают нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Ошибки
Функция pthread_attr_setinheritsched () м ожет завершиться неудачно, если:
[EINVAL] значение, заданное пара м етро м inheri tsched, недействительно;
[ENOTSUP] была сделана попытка установить атрибут равны м значению, которое не поддерживается реализацией.