Поделиться через


Объекты семафора

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

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

Поток использует функцию CreateSemaphore или CreateSemaphoreEx для создания объекта семафора. В потоке создания указывается начальное число и максимальное значение счетчика для объекта . Начальное число не должно быть ни меньше нуля, ни больше максимального значения. Создающий поток также может указать имя объекта семафора. Потоки в других процессах могут открывать дескриптор существующего объекта семафора, указывая его имя в вызове функции OpenSemaphore . Дополнительные сведения об именах объектов мьютекса, события, семафора и таймера см. в разделе Синхронизация межпроцессных операций.

Если на семафоре ожидается несколько потоков, выбирается ожидающий поток. Не предполагайте порядок "первым в систему" (FIFO). Внешние события, такие как APC в режиме ядра, могут изменить порядок ожидания.

Каждый раз, когда одна из функций ожидания возвращает значение , так как состояние семафора было задано как сигнальное, количество семафора уменьшается на один. Функция ReleaseSemaphore увеличивает количество семафоров на указанную величину. Число никогда не может быть меньше нуля или больше максимального значения.

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

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

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

Завершив использование объекта семафора, вызовите функцию CloseHandle , чтобы закрыть дескриптор. Объект семафора уничтожается при закрытии последнего дескриптора. Закрытие дескриптора не влияет на число семафоров; Поэтому обязательно вызовите ReleaseSemaphore перед закрытием дескриптора или перед завершением процесса. В противном случае время ожидания операций ожидания будет истекает или продолжается бесконечно в зависимости от того, задано ли значение времени ожидания.

Использование объектов семафора