Параллельное и распределенное программирование на С++ - Хьюз Камерон Страница 46

Тут можно читать бесплатно Параллельное и распределенное программирование на С++ - Хьюз Камерон. Жанр: Компьютеры и Интернет / Прочая околокомпьтерная литература. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте Knigogid (Книгогид) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.

Параллельное и распределенное программирование на С++ - Хьюз Камерон читать онлайн бесплатно

Параллельное и распределенное программирование на С++ - Хьюз Камерон - читать книгу онлайн бесплатно, автор Хьюз Камерон

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 предел может быть не определен, и функция может возвращать число -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

Поддерживает объекты общей памяти

Управление критическими разделами

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

Если существуют процессы или потоки, которые получают доступ к разделяемым модифицируемым данным, структурам данных или переменным, то все эти данные находятся в критической области (или разделе) кода процессов или потоков. Критический раздел кода — это та его часть, в которой обеспечивается доступ потока или процесса к разделяемому блоку модифицируемой памяти и обработка соответствующих данных. Отнесение раздела кода к критическому можно использовать для управления состоянием «гонок». Например, создаваемые в программе два потока, поток А и поток В, используются для поиска нескольких ключевых слов во всех файлах системы. Поток А просматривает текстовые файлы в каждом каталоге и записывает нужные пути в списочную структуру данных TextFiles, а затем инкрементирует переменную FileCount. Поток В выделяет имена файлов из списка TextFiles, декрементирует переменную FileCount, после чего просматривает файл на предмет поиска в нем заданных ключевых слов. Файл, который их содержит, переписывается в другой файл, и инкрементируется еще одна переменная FoundCount. К переменной FoundCount поток А доступа не имеет. Потоки А и В могут выполняться одновременно на отдельных процессорах. Поток А выполняется до тех пор, пока не будут просмотрены все каталоги, в то время как поток В просматривает каждый файл, путь к которому выделен из переменной TextFiles. Упомянутый список поддерживается в отсортированном порядке, и в любой момент его содержимое можно отобразить на экране.

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.