Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ТВП ЛР A5.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
611.84 Кб
Скачать

Увеличение значения счетчика семафора

Для увеличения значения счетчика семафора приложение должно Использовать функцию ReleaseSemaphore:

BOOL ReleaseSemaphore(

HANDLE hSemaphore,

// идентификатор семафора

LONG cReleaseCount,

// значение инкремента

LPLONG IplPreviousCount);

// адрес переменной для записи

// предыдущего значения счетчика семафора

Функция ReleaseSemaphore увеличивает значение счетчика семафора, идентификатор которого передается ей через параметр hSemaphore, на значение, указанное в параметре cReleaseCount.

Заметим, что через параметр cReleaseCount вы можете передавать только положительное значение не равные нулю. При этом если в результате увеличения новое значение счетчика должно будет превысить максимальное значение, заданное при образовании семафора, функция ReleaseSemaphore возвращает признак ошибки и не изменяет значения счетчика.

Предыдущее значение счетчика, которое было до использования функции ReleaseSemaphore, записывается в переменную типа LONG. Адрес этой переменной передается функции через параметр lplPreviousCount,

Если функция ReleaseSemaphore завершилась успешно, она возвращает значение TRUE. При ошибке возвращается значение FALSE. Код ошибки в этом случае можно определить, как обычно, при помощи функции GetLastError.

Функция используется обычно для решения двух задач.

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

Во-вторых, эта функция может быть использована на этапе инициализации мультизадачного приложения. Создавая семафор с начальным значением счетчика равным нулю, главная задача блокирует работу задач, выполняющих ожидание этого семафора. После завершения инициализации главная задача с помощью функции ReleaseSemaphore может увеличить значение счетчика семафора до максимального, в результате чего известное количество ожидающих задач будет активизировано.

Уменьшение значения счетчика семафора

В программном интерфейсе операционных систем Microsoft Windows нет функции, специально предназначенной для уменьшения значения счетчика семафора. Счетчик уменьшается, когда задача вызывает функцию ожидания, такую, как WaitForSingleObject. Если задача вызывает несколько раз функцию ожидания для одного и того же семафора, содержимое его счетчика каждый раз будет уменьшаться.

Определение текущего значения счетчика семафора

Единственная возможность определения текущего значения счетчика семафора заключается в увеличении этого значения функцией ReleaseSemaphore. Значение счетчика, которое было до увеличения, будет записано в переменную, адрес которой передается функции ReleaseSemaphore через параметр IplPreviousCount.

Заметим, что в операционных системах Microsoft Windows не предусмотрено средств, с помощью которых можно было бы определить текущее значение семафора, не изменяя его. В частности, вы не можете задать функции ReleaseSemaphore нулевое значение инкремента, так как в этом случае функция просто вернет соответствующий код ошибки.

7.5 Ожидаемые таймеры

Ожидаемые таймеры (waitable timers) - это объекты синхронизации, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени. Ожидаемый таймер отсутствует в Windows 95 и для его использования необходимы: Windows 98, Windows NT 4.0 и выше.