Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / Answers (20-40).docx
Скачиваний:
212
Добавлен:
15.06.2014
Размер:
38.2 Кб
Скачать

39. Средства множественных ожиданий

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

В Windows для множественного ожидания предназначена универсальная функция WaitForMultipleObjects с прототипом

DWORD WaitForMultipleObjects(DWORD cObjects, CONST HANDLE *phObjects, BOOL fWaitAll, DWORD Timeout);

где параметр cObjects для данного применения задает число семафоров в наборе, параметр phObjects – адрес массива хэндлов отдельных семафоров в наборе, параметр Timeout – время ожидания в миллисекундах или записывается символической константой INFINITE– для бесконечного ожидания. С помощью параметра fWaitAll определяется вариант ожидания – ожидать срабатывания всех семафоров в наборе (значение параметра для этого должно быть TRUE) или ожидание завершается при срабатывании хотя бы одного семафора в наборе (при значении FALSE этого параметра). Возвращаемые значения этой функции, равные сумме константы WAIT_OBJECT_0 и числового значения k, информируют программу, что ожидание было прекращено по причине срабатывания k-го семафора в наборе.

В операционной системе Unix не предусмотрено стандартных средств для множественного ожидания срабатывания набора mutex-семафоров или семафоров ожидания (условных переменных). Вместо этого присутствуют мощные программные средства, позволяющие строить произвольные наборы считающих семафоров.

40. Программные семафоры с внутренним счетчиком в Windows.

(счётчик – подсчёт числа свободных единиц ресурса; счётчик >=0, если <0 – заблокир.)

Создание:

HANDLE CreateSemaphore(адрес атрибутов защиты или NULL, LONG начальное значение счётчика, LONG maxValue //допустимое знач-е счётчика, имя семафора или NULL);

Ожидание таких семафоров:

WaitForSingleObject(HANDLE hsem, timeout); если значение семафора =0, то ожидание, иначе уменьшение на 1.

Изменение значения счетчика семафора:

BOOL ReleaseSemaphore(HANDLE hsem, LONG приращение значения(>0), LONG *oldvalue (предыдущее значение));

Открытие семафора для доступа от другого процесса:

HANDLE OpenSemaphore(DWORD access, DWORD inherit, имя семафора);

Соседние файлы в папке Экзамен