Пример: объект порогового барьера

Пример: объект порогового барьера

Предположим, вам необходимо, чтобы рабочие потоки оставались в состоянии ожидания и не выполнялись до тех пор, пока количество таких потоков не станет достаточным для образования рабочей группы, способной выполнить нужную работу. Как только количество потоков достигает порогового значения, все ожидающие рабочие потоки начинают выполняться, а появляющиеся впоследствии дополнительные рабочие потоки будут выполняться без ожидания. Эту задачу можно решить путем создания сложного объекта порогового барьера (threshold barrier compound object).

В программах 10.1 и 10.2 представлена реализация трех функций, поддерживающих сложный объект барьера. Две из этих функций, CreateThresholdBarrier и CloseThresholdBarrier, управляют переменными THB_HANDLE, аналогичными дескрипторам, которые на протяжении всего времени применялись нами вместе с объектами ядра. Пороговое количество потоков является параметром функции CreateThresholdBarrier. 

Программа 10.1 представляет соответствующую часть заголовочного файла, SynchObj.h, тогда как программа 10.2 — реализацию трех упомянутых функций. Обратите внимание, что объект барьера содержит мьютекс, событие, счетчик и пороговое значение. Предикат переменной условия документирован в заголовочном файле, а именно, событие должно устанавливаться только тогда, когда значение счетчика достигает или становится больше порогового значения.

Программа 10.1. SynchObj.h: часть 1 — объявления объекта порогового барьера 

/* Глава 10. Сложные объекты синхронизации. */

#define CV_TIMEOUT 50 /* Настраиваемый параметр для модели CV. */

/* ОБЪЕКТ ПОРОГОВОГО БАРЬЕРА — ОПРЕДЕЛЕНИЕ ТИПА И ПРОТОТИПЫ ФУНКЦИЙ. */

typedef struct THRESHOLD_BARRIER_TAG { /* Пороговый барьер. */

 HANDLE b_guard; /* Мьютекс для объекта. */

 HANDLE b_broadcast; /* Вручную сбрасываемое событие: b_count >= b_threshold.*/

 volatile DWORD b_destroyed; /* Установить после закрытия. */

 volatile DWORD b_count; /* Количество потоков до достижения барьера. */

 volatile DWORD b_threshold; /* Пороговый барьер. */

} THRESHOLD_BARRIER, *THB_HANDLE;

/* Коды ошибок. */

#define SYNCH_OBJ_NOMEM 1 /* Невозможно выделить ресурсы. */

#define SYNCH_OBJ_BUSY 2 /* Объект используется и не может быть закрыт. */

#define SYNCH_OBJ_INVALID 3 /* Объект более не является действительным. */

DWORD CreateThresholdBarrier(THB_HANDLE *, DWORD /* Порог. */);

DWORD WaitThresholdBarrier(THB_HANDLE);

DWORD CloseThresholdBarrier(THB_HANDLE); 

Рассмотрим теперь предложенную в программе 10.2 реализацию трех функций. На Web-сайте книги находится тестовая программа testTHB. Обратите внимание на уже знакомый вам цикл проверки переменной условия в функции ожидания WaitThresholdBarrier. Кроме того, эта функция не только ожидает наступления события, но и переводит объект события в сигнальное состояние с помощью функции PulseEvent. Предыдущее обсуждение модели "производитель/потребитель" предполагало использование отдельных функций потоков.

Наконец, в данном случае предикат переменной условия обладает последействием. Как только условие выполнилось, оно будет выполняться и в дальнейшем, что исключает возможность перевода объекта события в сигнальное состояние более одного раза.

Программа 10.2. ThbObject.с: реализация объекта порогового барьера 

/* Глава 10. Программа 10.2. */

/* Библиотека сложных объектов синхронизации на основе порогового барьера.*/

#include "EvryThng.h"

#include "synchobj.h" 

/**********************************/

/*   ОБЪЕКТЫ ПОРОГОВОГО БАРЬЕРА   */

/**********************************/

DWORD CreateThresholdBarrier(THB_HANDLE *pthb, DWORD b_value) {

 THB_HANDLE hthb;

 /* Инициализация объекта барьера. Вариант программы с полной проверкой ошибок находится на Web-сайте. */

 hthb = malloc(sizeof(THRESHOLD_BARRIER));

 hthb->b_guard = CreateMutex(NULL, FALSE, NULL);

 hthb->b_broadcast = CreateEvent(NULL, FALSE /* Автоматически сбрасываемое событие. */, FALSE, NULL);

 hthb->b_threshold = b_value;

 hthb->b_count = 0;

 hthb->b_destroyed = 0;

 *pthb = hthb;

 return 0;

}

DWORD WaitThresholdBarrier(THB_HANDLE thb) {

 /* Ожидать, пока заданное количество потоков не достигнет порога, а затем установить событие. */

 if (thb->b_destroyed == 1) return SYNCH_OBJ_INVALID;

 WaitForSingleObject(thb->b_guard, INFINITE);

 thb->b_count++; /* Появился новый поток. */

 while (thb->b_count < thb->b_threshold) {

  SignalObjectAndWait(thb->b_guard, thb->b_broadcast, INFINITE, FALSE);

  WaitForSingleObject(thb->b_guard, INFINITE);

 }

 PulseEvent(thb->b_broadcast) ;

 /* Широковещательная модель CV, освобождение всех ожидающих потоков. */

 ReleaseMutex(thb->b_guard);

 return 0;

}

DWORD CloseThresholdBarrier(THB_HANDLE thb) {

 /* Уничтожить мьютекс и событие объекта барьера. */

 /* Убедиться в отсутствии потоков, ожидающих объект. */

 if (thb->b_destroyed == 1) return SYNCH_OBJ_INVALID;

 WaitForSingleObject(thb->b_guard, INFINITE);

 if (thb->b_count < thb->b_threshold) {

  ReleaseMutex(thb->b_guard);

  return SYNCH_OBJ_BUSY;

 }

 ReleaseMutex(thb->b_guard);

 CloseHandle(thb->b_guard);

 CloseHandle(thb->b_broadcast);

 free(thb);

 return 0;

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Активный объект

Из книги Самоучитель UML автора Леоненков Александр

Активный объект В контексте языка UML все объекты делятся на две категории: пассивные и активные. Пассивный объект оперирует только данными и не может инициировать деятельность по управлению другими объектами. Однако пассивные объекты могут посылать сигналы в процессе


Составной объект

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Составной объект Составной объект (composite object) или объект-контейнер предназначен для представления объекта, имеющего собственную структуру и внутренние потоки (нити) управления. Составной объект является экземпляром составного класса (класса-контейнера), который связан


Объект WScript

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Объект WScript Свойства объекта WScript позволяют получить полный путь к использующемуся серверу сценариев (wscript.exe или cscript.exe), параметры командной строки, с которыми запущен сценарий, режим его работы (интерактивный или пакетный). Кроме этого, с помощью свойств объекта WScript


Объект WshArguments

Из книги Справочник по JavaScript автора Коллектив авторов

Объект WshArguments Объект WshArguments содержит коллекцию всех параметров командной строки запущенного сценария или ярлыка Windows. Этот объект можно создать только с помощью свойства Arguments объектов WScript и WshShortcut.В принципе, работать с элементами коллекции WshArguments можно стандартным


Пример: СОМ-объект для архивирования файлов

Из книги Приемы создания интерьеров различных стилей автора Тимофеев С. М.

Пример: СОМ-объект для архивирования файлов Представим себе следующую ситуацию. Имеется несколько каталогов на жестком диске, в которых хранятся рабочие файлы разных пользователей. Необходимо каждый день с помощью программы-архиватора arj.exe делать архивы этих файлов в


Комментарии по поводу реализации объекта порогового барьера

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Комментарии по поводу реализации объекта порогового барьера Возможности реализованного выше объекта порогового барьера в интересах простоты были намеренно ограничены. Вообще говоря, было бы желательно эмулировать объекты Windows следующим образом:• Разрешив объектам


Объект history

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Объект history Объект history представляет интерфейс к списку истории Web-обозревателя, т.е. списку всех Web-страниц, просмотренных пользователем в течение времени, указанного в настройках.Свойства объекта historycurrentВозвращает интернет-адрес документа, загруженного в настоящее


Объект

Из книги Разработка ядра Linux автора Лав Роберт

Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин "объект" обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность


Параметры барьера

Из книги автора

Параметры барьера Следующие функции инициализируют и разрушают блок параметров барьера:int pthread_barrierattr_init(pthread_barrierattr_t* attr);int pthread_barrierattr_destroy(pthread_barrierattr_t* attr);Функция инициализации возвращает следующие значения:EOK — успешное выполнение;ENOMEM — недостаточно памяти для


Инициализация и разрушение барьера

Из книги автора

Инициализация и разрушение барьера int pthread_barrier_init(pthread_barrier_t* barrier, const pthread_barrierattr_t* attr, unsigned int count);Функция инициализирует объект синхронизации типа барьер, после чего его можно использовать. В атрибутах барьера устанавливается (или запрещается) возможность доступа к


Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя

Из книги автора

Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя #!/bin/bash# timeout.sh# Автор: Stephane Chazelas,# дополнен автором документа.INTERVAL=5 # предел времени ожиданияtimedout_read() { timeout=$1 varname=$2 old_tty_settings=`stty -g` stty -icanon min 0 time ${timeout}0 eval read $varname # или просто read $varname


Пример 12-20. Пример форматирования списка файлов в каталоге

Из книги автора

Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее


Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"

Из книги автора

Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков" #!/bin/bashARGS=1 # Ожидаемое число аргументов.E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS# Если


Пример 25-8. Пример реализации алгоритма Решето Эратосфена

Из книги автора

Пример 25-8. Пример реализации алгоритма Решето Эратосфена #!/bin/bash# sieve.sh# Решето Эратосфена# Очень старый алгоритм поиска простых чисел.# Этот сценарий выполняется во много раз медленнее# чем аналогичная программа на C.LOWER_LIMIT=1 # Начиная с 1.UPPER_LIMIT=1000 # До 1000.# (Вы можете


Объект address_space

Из книги автора

Объект address_space Физическая страница памяти может содержать данные из нескольких несмежных физических дисковых блоков[85].Проверка наличия определенных данных в страничном кэше может быть затруднена, если смежные блоки принадлежат совершенно разным страницам памяти.