Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Синопсис
#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 может принимать одно из следующих значений.
PTHREAD_INHERIT_SCHEDАтрибуты планирования потока должны быть унаследованы от потока-создателя, при этом любые атрибуты планирования, определяемые параметром attr, будут игнорироваться.
PTHREAD_EXPLICIT_SCHEDАтрибуты планирования потока должны быть установлены в соответствии с атрибутами планирования, хранимыми в объекте, заданном параметром attr.
Если параметр inheritsched получает значение PTHREAD_EXPLICIT_SCHED,то функция pthread_attr_setschedpolicy() используется для установки стратегии планирования, а функция pthread_attr_setschedparam() — установки приоритета.
Функция pthread_attr_setschedpolicy() устанавливает член объекта атрибутов потока (заданного параметром attr), «отвечающий» за стратегию планирования потока. Параметр policy может принимать одно из следующих значений, определенных в заголовке .
SCHED_FIFOСтратегия планирования типа FIFO (первым прибыл, первым обслужен), при которой поток выполняется до конца.
SCHED_RR Стратегия циклического планирования, при которой каждый поток
назначается процессору только в течение некоторого кванта времени- SCHED_OTHERСтратегия планирования другого типа (определяемая реализацией)-Для любого нового потока эта стратегия планирования принимается по умолчанию.
Функ ция pthread_attr_setschedparam() используется для установки членов атрибутного объекта (заданного параметром attr), связанных со стратегией планирования Параметр param представляет собой структуру, которая содержит эти члены. Структура sched_param включает по крайней мере такой член данных: struct sched_param {
int sched_priority;
//...
};
Возможно, эта структура содержит и другие члены данных, а также ряд функций, предназначенных для установки и считывания минимального и максимального значений приоритета, атрибутов планировщика и пр. Но если для задания стратегии планирования используется либо значение SCHED_FIFO,либо значение SCHED_RR,то в структуре sched_param достаточно определить только член sched_priority.
Чтобы получить минимальное и максимальное значения приоритета, используйте функции sched_get_priority_min () и sched_get_priority_max ().
Синопсис
#include
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
Обеим функциям в качестве параметра policy передается значение, определяющее выбранную стратегию планирования, для которой нужно установить значения приоритета, и обе функции возвращают соответствующее значение приоритета (минимальное и максимальное) для заданной стратегии планирования.
Как установить стратегию планирования и приоритет потока с помощью атрибутного объекта, показано в листинге 4.4.
// Листинг 4.4. Использование атрибутного объекта потока И для установки стратегии планирования и
II приоритета потока
#define Min_Stack_Req 3000000
pthread_t ThreadA;
pthread_attr_t SchedAttr;
size_t DefaultSize,SizeOffset,NewSize;
int MinPriority,MaxPriority,MidPriority;
sched_param SchedParam;
int main(int argc, char *argv[])
{
//...
// initialize attribute object
pthread_attr_init(&SchedAttr);
// retrieve min and max priority values for scheduling policy
MinPriority = sched_get_priority_max(SCHED_RR);
MaxPriority = sched_get_priority_min(SCHED_RR);
// calculate priority value
MidPriority = (MaxPriority + MinPriority)/2;
// assign priority value to sched_param structure
SchedParam.sched_priority = MidPriority;
// set attribute object with scheduling parameter
pthread_attr_setschedparam(&Attr1,&SchedParam);
// set scheduling attributes to be determined by attribute object
pthread_attr_setinheritsched(&Attr1,PTHREAD_EXPLICIT_SCHED);
// set scheduling policy
pthread_attr_setschedpolicy(&Attr1,SCHED_RR);
// create thread with scheduling attribute object
pthread_create(&ThreadA,&Attr1,task2,Value);
}
В листинге 4.4 стратегия планирования и приоритет потока ThreadAустанавливаются с использованием атрибутного объекта SchedAttr.Выполним следующие действия.
1. Инициализируем атрибутный объект.
2. Считаем минимальное и максимальное значения приоритета для стратегии планирования.
3. Вычислим значение приоритета.
4. Запишем значение приоритета в структуру sched_param.
5. Установим атрибутный объект.
Читать дальшеИнтервал:
Закладка: