Мобильное программирование приложений реального времени в стандарте POSIX



Опрос и изменение атрибутов потоков управления - часть 2


листинг 1.4).

#include <pthread.h>

int pthread_attr_getstack ( const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize);

int pthread_attr_setstack ( pthread_attr_t *attr, void *stackaddr, size_t stacksize);

Листинг 1.4. Описание функций pthread_attr_getstack() и pthread_attr_setstack().

Размер стека должен составлять не менее PTHREAD_STACK_MIN, начальный адрес – должным образом выровнен. Память, отведенная под стек, должна быть доступна на чтение и запись.

Функция pthread_attr_getstack() помещает атрибуты стека по указателям stackaddr и stacksize. Это – проявление единообразной для семейства функций pthread*(), обслуживающих потоки управления, дисциплины возврата результатов. Содержательные данные помещаются в выходные аргументы. При нормальном завершении результат функции равен нулю; в противном случае выдается код ошибки.

Подобная дисциплинированность является похвальной, но вынужденной. Ее причина – в разделении данных между потоками. Нельзя просто вернуть указатель на статический буфер – другой поток может в это время так или иначе работать с ним. Поэтому поток должен зарезервировать индивидуальные области памяти для размещения выходных значений (обратившись, например, к malloc()) и передать функции указатели на них.

Для опроса и изменения размера защитной области, служащей цели обнаружения переполнения стека, предназначены функции pthread_attr_getguardsize() и pthread_attr_setguardsize() (см. листинг 1.5).

#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);

Листинг 1.5. Описание функций pthread_attr_getguardsize() и pthread_attr_setguardsize().

Если значение аргумента guardsize функции pthread_attr_setguardsize() равно нулю, при создании потоков управления с атрибутным объектом *attr защитная область отводиться не будет. Положительные величины guardsize также становятся новыми значениями одноименного атрибута, однако являются лишь указанием операционной системе; реальный размер защитной области может быть больше заданного.




Содержание  Назад  Вперед