Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
6. Обеспечим установку атрибутов планирования с помощью атрибутного объекта.
7. Установим стратегию планирования.
8. Создадим поток с помощью атрибутного объекта.
Последовательное выполнение этих действий позволяет установить стратегию планирования и приоритет потока до его создания. Для динамического изменения стратегии планирования и приоритета используйте функции pthread_setschedparam() и pthread_setschedprio().
Синопсис
#include
int pthread_setschedparam(pthread_t thread,
int policy,
const struct sched_param *param);
int pthread_getschedparam(
pthread_t thread,
int *restrict policy,
struct sched_param *restrict param);
int pthread_setschedprio(pthread_t thread, int prio);
Функция pthread_setschedparam() устанавливает как стратегию планирования, так и приоритет потока без использования атрибутного объекта. Параметр thread содержит идентификатор потока, параметр policy — новую стратегию планирования и параметр param — значения, связанные с приоритетом. Функция pthread_getschedparam() сохраняет значения стратегии планирования и приоритета в параметрах policy и param соответственно. При успешном выполнении обе функции возвращают число 0 ,в противном случае — код ошибки. Условия, при которых эти функции могут завершиться неудачно, перечислены в табл. 4.7.
Таблица4.7. Условия потенциального неудачного завершения функций установки стратегии планирования и приоритета
Функции
Условия отказа
pthread_getschedparam
• Параметр thread не ссылается на существующий поток
pthread_setschedparam
• Некорректен параметр policy или один из членов структуры, на которую указывает параметр param
• Параметр policy или один из членов структуры, на которую указывает параметр param, содержит значение, которое не поддерживается в данной среде
• Вызывающий поток не имеет соответствующего разрешения на установку значений приоритета или стратегии планирования для заданного потока
• Параметр thread не ссылается на существующий поток
• Данная реализация не позволяет приложению заменить один из параметров планирования заданным значением
pthread_setschedprio
• Параметр prio не подходит к стратегии планирования заданного потока
• Параметр prio имеет значение, которое не поддерживается в данной среде
• Вызывающий поток не имеет соответствующего разрешения на установку приоритета для заданного потока
• Параметр thread не ссылается на существующий поток
• Данная реализация не позволяет приложению заменить значение приоритета заданным
Функция pthread_setschedprio() используется для установки значения приоритета выполняемого потока, идентификатор которого задан параметром thread В результате выполнения этой функции текущее значение приоритета будет заменено значением параметра prio. При успешном выполнении функция возвращает число 0 в противном случае — код ошибки. При неуспешном выполнении функции приоритет потока изменен не будет. Условия, при которых эта функция может завершиться неуспешно, также перечислены в табл. 4.7.
ПРИМЕЧАНИЕ: к изменению стратегии планирования или приоритета выполняемого потока необходимо отнестись очень осторожно. Это может непредсказуемым образом повлиять на общую эффективность приложения. Потоки с более высоким приоритетом будут вытеснять потоки с более низким, что приведет к зависанию либо к тому, что поток будет постоянно выгружаться с процессора и поэтому не сможет завершить выполнение.
Установка области конкуренции потока
Область конкуренции потока определяет, какое множество потоков с одинаковыми стратегиями планирования и приоритетами будут состязаться за использование процессора. Область конкуренции потока устанавливается его атрибутным объектом.
Синопсис
#include
int pthread_attr_setscope(pthread_attr_t *attr,
int contentionscope);
int pthread_attr_getscope(
const pthread_attr_t *restrict_attr,
int *restrict contentionscope) ;
Функция pthread_attr_setscope() устанавливает член объекта атрибутов потока (заданного параметром attr), связанный с областью конкуренции. Область конкуренции потока будет установлена равной значению параметра contentionscope, который может принимать следующие значения.
PTHREAD_SCOPE_SYSTEMОбласть конкуренции системного уровня PTHREAD_SCOPE_PROCESSОбласть конкуренции уровня процесса
Функция pthread_attr_getscope() возвращает атрибут области конкуренции из объекта атрибутов потока, заданного параметром attr. При успешном выполнении значение области конкуренции сохраняется в параметре contentionscope. Обе функции при успешном выполнении возвращают число 0 ,в противном случае — код ошибки-
Использование функции sysconf ()
Знание пределов, устанавливаемых системой на использование ресурсов, позволит вашему приложению эффективно управлять ресурсами. Например, максимальное количество потоков, приходящихся на один процесс, составляет верхнюю границу числа рабочих потоков, которое может быть создано процессом. Функция sysconf () используется для получения текущего значения конфигурируемых системных пределов или опций
Синопсис
#include
#include
Параметр name - это запрашиваемая системная переменная. Функция возвращает значения, соответствующие стандарту POSIX IEEE Std. 1003.1-2001 для заданных системных переменных. Эти значения можно сравнить с константами, определенными вашей реализацией стандарта, чтобы узнать, насколько они согласуются между собой. Для ряда системных переменных существуют константы-аналоги, относящиеся к потокам, процессам и семафорам (см. табл. 4.8).
Если параметр name не действителен, функция sysconf () возвращает число -1и устанавливает переменную errno, свидетельствующую об ошибке. Однако для заданного параметра name предел может быть не определен, и функция может возвращать число -1 как действительное значение. В этом случае переменная errno не устанавливается. Необходимо отметить, что неопределенный предел не означает безграничность ресурса Это просто означает, что не определен максимальный предел и (при условии доступности системных ресурсов) могут поддерживаться более высокие предельные значения. Рассмотрим пример вызова функции sysconf ():
if(PTHREAD_STACK_MIN == (sysconf(_SC_THREAD_STACK_MIN))){
//...
}
Значение константы PTHREAD_STACK_MINсравнивается со значением, возвращаемым функцией sysconf (), вызванной с параметром _SC_THREAD_STACK_MIN.
Таблица4.8. Системные переменные и соответствующие им символьные константы
Переменная | Значение | Описание |
_SC_THREADS | _POSIX_THREADS | Поддерживает потоки |
_SC_THREAD_ATTR_ STACKADDR | _POSIX_THREAD_ATTR_ STACKADDR | Поддерживает атрибут адреса стека потока |
_SC_THREAD_ATTR_ STACKSIZE | _POSIX_THREAD_ATTR_ STACKSIZE | Поддерживает атрибут размера стека потока |
_SC_THREAD_STACK_ MIN | PTHREAD_STACK_MIN | Минимальный размер стека потока в байтах |
_SC_THREAD_THREADS_MAX | PTHREAD_THREADS MAX | Максимальное количество потоков на процесс |
_SC_THREAD_KEYS_MAX | PTHREAD_KEYS_MAX | Максимальное количество ключей на процесс |
_SC_THREAD_PRIO_INHERIT | _POSIX_THREAD_PRIO_ INHERIT | Поддерживает опцию наследования приоритета |
_SC_THREAD_PRIO | _POSIX THREAD_PRIO | Поддерживает опцию приоритета потока |
_SC_THREAD_PRIORITY_ SCHEDULING | _POSIX_THREAD_PRIORITY_SCHEDULING | Поддерживает опцию планирования приоритета потока |
_SC_THREAD_PROCESS_SHARED | _POSIX_THREAD_PROCESS_SHARED | Поддерживает синхронизацию на уровне процесса |
_SC_THREAD_SAFE_ FUNCTIONS | _POSIX_THREAD_SAFE_FUNCTIONS | Поддерживает функции безопасности потока |
_SC_THREAD_ DESTRUCTOR_ ITERATIONS | _PTHREAD_THREAD_DESTRUCTOR_ITERATIONS | Определяет количество попыток, направленных на разрушение потоковых данных при завершении потока |
_SC_CHILD_MAX | CHILD_MAX | Максимальное количество процессов, разрешенных для UID |
_SC_PRIORITY_ SCHEDULING | _POSIX_PRIORITY_ SCHEDULING | Поддерживает планирование процессов |
_SC_REALTIME_ SIGNALS | _POSIX_REALTIME_SIGNALS | Поддерживает сигналы реального времени |
_SC_XOPEN_REALTIME_THREADS | _XOPEN_REALTIME_ THREADS | Поддерживает группу потоковых средств реального времени X/Open POSIX |
_SC_STREAM_MAX | STREAM_MAX | Определяет количество потоков данных, которые один процесс может открыть одновременно |
_SC_SEMAPHORES | _POSIX_SEMAPHORES | Поддерживает семафоры |
_SC_SEM_NSEMS_MAX | SEM_NSEMS_MAX | Определяет максимальное количество семафоров, которое может иметь процесс |
_SC_SEM_VALUE_MAX | SEM_VALUE_MAX | Определяет максимальное значение, которое может иметь семафор |
_SC_SHARED_MEMORY_ OBJECTS | _POSIX_SHARED_MEMORY_OBJECTS | Поддерживает объекты общей памяти |
Управление критическими разделами
Интервал:
Закладка: