Параллельное и распределенное программирование на С++
Шрифт:
ПРИМЕЧАНИЕ: к изменению стратегии планирования или приоритета выполняемого потока необходимо отнестись очень осторожно. Это может непредсказуемым образом повлиять на общую эффективность приложения. Потоки с более высоким приоритетом будут вытеснять потоки с более низким, что приведет к зависанию либо к тому, что поток будет постоянно выгружаться с процессора и поэтому не сможет завершить выполнение.
Установка области конкуренции потока
Область
Синопсис
#include <pthread.h>
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 <unistd.h>
#include <limits.h>
Параметр name - это запрашиваемая системная переменная. Функция возвращает значения, соответствующие стандарту POSIX IEEE Std. 1003.1-2001 для заданных системных переменных. Эти значения можно сравнить с константами, определенными вашей реализацией стандарта, чтобы узнать, насколько они согласуются между собой. Для ряда системных переменных существуют константы-аналоги, относящиеся к потокам, процессам и семафорам (см. табл. 4.8).
Если параметр name не действителен, функция sysconf возвращает число – 1 и устанавливает переменную errno, свидетельствующую об ошибке. Однако для заданного параметра name
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