Синопсис
#include
void pthread_attr_getstacksize(
const pthread_attr_t *restrict attr, void **restrict stacksize);
void pthread_attr_setstacksize(pthread_attr_t *attr, void *stacksize);
Местоположение стека потока можно установить и прочитать с помощью функций pthread_attr_setstackaddr() и pthread_attr_getstackaddr(). Функция pthread_attr_setstackaddr() для потока, создаваемого с помощью атрибутного объекта, заданного параметром attr, устанавливает базовый адрес стека равным адресу, заданному параметром stackaddr. Этот адрес stackaddr должен находиться в пределах виртуального адресного пространства процесса. Размер стека должен быть не меньше минимального размера стека, задаваемого значением PTHREAD_STACK_MIN.При успешном выполнении функция возвращает значение 0 ,в противном случае — код ошибки.
Функция pthread_attr_getstackaddr () считывает базовый адрес стека для потока, создаваемого с помощью атрибутного объекта потока, заданного параметром attr. Считанный адрес сохраняется в параметре stackaddr. При успешном выполнении функция возвращает значение 0 ,в противном случае — код ошибки.
Синопсис
#include
void pthread_attr_setstackaddr(pthread_attr_t *attr,
void *stackaddr);
void pthread_attr_getstackaddr(const pthread_attr_t *restrict attr, void **restrict stackaddr);
Атрибуты стека (размер и местоположение) можно установить с помощью одной функции. Функция pthread_attr_setstack() устанавливает как размер, так и адрес стека для потока, создаваемого с помощью атрибутного объекта, заданного параметром attr. Базовый адрес стека устанавливается равным адресу, заданному параметром stackaddr, а размер стека — равным значению параметра stacksize. Функция pthread_attr_getstack() считывает размер и адрес стека для потока, создаваемого с помощью атрибутного объекта, заданного параметром attr. При успешном выполнении функция возвращает значение 0 ,в противном случае — код ошибки. Если считывание атрибутов стека прошло успешно, адрес будет записан в параметр stackaddr, а размер— в параметр stacksize. Функция pthread_setstack() выполнится неудачно, если значение параметра stacksize окажется меньше значения PTHREAD_STACK_MIN или превысит некоторый предел, определяемый реализацией.
Синопсис
#include
void pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr,
size_t stacksize);
void pthread_attr_getstack(const pthread_attr_t *restrict attr,
void **restrict stackaddr, size_t stacksize);
В листинге 4.3 показан пример установки размера стека для потока, создаваемого с помощью атрибутного объекта.
// Листинг 4.3. Изменение размера стека для потока
// с использованием смещения
pthread_attr_getstacksize(&SchedAttr, &DefaultSize) ;
if(DefaultSize < Min_Stack_Req){
SizeOffset = Min_Stack_Req - DefaultSize;
NewSize = DefaultSize + SizeOffset;
pthread_attr_setstacksize(&Attrl, (size_t)NewSize);
}
В листинге 4.3 сначала из атрибутного объекта потока считывается размер стека, действующий по умолчанию. Затем, если окажется, что этот размер меньше желаемого минимального размера стека, вычисляется разность между сравниваемыми размерами, после чего значение этой разности (смещение) суммируется с размером стека, используемым по умолчанию. Результат суммирования становится новым минимальным размером стека для этого потока.
ПРИМЕЧАНИЕ:установка размера и местоположения стека может сделать вашу программу непереносимой. Размер и местоположение стека, устанавливаемые на одной платформе, могут оказаться неподходящими для использования в качестве размера и местоположения стека для другой платформы.
Установка атрибутов планирования и свойств потоков
Подобно процессам, потоки выполняются независимо один от другого. Каждый поток назначается процессору для выполнения его задачи. Для каждого потока определяется стратегия планирования и приоритет, которые предписывают, как и когда именно он будет назначен процессору. Стратегия планирования и приоритет потока (или группы потоков) у станав ливаются с помощью объекта атрибутов и следующих функций:
pthread_attr_setinheritsched()
pthread_attr_setschedpolicy()
pthread_attr_setschedparam()
Для получения информации о характере выполнения потока используются следующие функции:
pthread_attr_getinheritsched()
pthread_attr_getschedpolicy()
pthread_attr_getschedparam()
Синопсис
#include
#include
void pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
void pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
void pthread_attr_setschedparam(pthread_attr_t *restrict attr,
const struct sched_param *restrict param);
Функции pthread_attr_setinheritsched(), pthread_attr_setschedpolicy () и pthread_attr_setschedparam() используются для установки стратегии планирования и приоритета потока. Функция pthread_attr_setinheritsched() позволяет определить, как будут устанавливаться атрибуты планирования потока: путем наследования от потока-создателя или в соответствии с содержимым объекта атрибутов. Параметр inheritsched может принимать одно из следующих значений.
Читать дальше