Объекты Семафора
Объект семафора — это объект синхронизации, который поддерживает количество от нуля до указанного максимального значения. Число уменьшается каждый раз, когда поток завершает ожидание объекта семафора и увеличивается каждый раз, когда поток освобождает семафор. Когда число достигает нуля, больше потоков не может успешно ждать, пока состояние объекта семафора станет сигналом. Состояние семафора задается для сигнала, когда его число больше нуля, и незначен, если его число равно нулю.
Объект семафора полезен при управлении общим ресурсом, который может поддерживать ограниченное количество пользователей. Он выступает в качестве шлюза, который ограничивает количество потоков, совместно использующих ресурс, до указанного максимального числа. Например, приложение может поместить ограничение на количество создаваемых окон. Он использует семафор с максимальным числом, равным ограничению окна, уменьшая количество всякий раз при создании окна и добавив его при закрытии окна. Приложение задает объект семафора при вызове одной из функций ожидания ожидания, перед созданием каждого окна. Если число равно нулю, указывающее, что достигнуто ограничение окна, функция ожидания блокирует выполнение кода создания окна.
Поток использует функцию CreateSemaphore CreateSemaphore или CreateSemaphoreEx для создания объекта семафора. Создание потока указывает начальное число и максимальное значение счетчика для объекта. Начальное число не должно быть меньше нуля или больше максимального значения. Создание потока также может указать имя объекта семафора. Потоки в других процессах могут открывать дескриптор существующему объекту семафора, указав его имя в вызове функции OpenSemaphore. Дополнительные сведения о именах для объектов мьютекса, событий, семафора и таймера см. в синхронизации межпроцессных операций.
Если несколько потоков ожидает семафора, выбран поток ожидания. Не предполагайте порядок первого входа (FIFO). Внешние события, такие как API режима ядра, могут изменить порядок ожидания.
Каждый раз, когда одна из функций ожидания возвращается, так как состояние семафора было задано для сигнала, количество семафора уменьшается на один. Функция ReleaseSemaphore увеличивает количество семафора на указанную сумму. Число никогда не может быть меньше нуля или больше максимального значения.
Начальное число семафора обычно присваивается максимальному значению. Затем количество уменьшается с этого уровня по мере использования защищенного ресурса. Кроме того, можно создать семафор с начальным числом нулей, чтобы заблокировать доступ к защищенному ресурсу во время инициализации приложения. После инициализации можно использовать ReleaseSemaphore для увеличения числа до максимального значения.
Поток, принадлежащий объекту мьютекса, может ждать несколько раз, пока один и тот же объект мьютекса будет сигнализировать без его выполнения становится заблокированным. Поток, который несколько раз ожидает одного и того же объекта семафора, однако уменьшает количество семафора при каждом завершении операции ожидания; Поток блокируется, когда число возвращается к нулю. Аналогичным образом, только поток, принадлежащий мьютексу, может успешно вызывать функцию ReleaseMutex, хотя любой поток может использовать ReleaseSemaphore для увеличения количества объектов семафора.
Поток может уменьшать количество семафора несколько раз, многократно указывая один и тот же объект семафора в вызовах любой из функций ожидания . Однако вызов одной из функций ожидания с несколькими объектами с массивом, содержащим несколько дескрипторов одного семафора, не приводит к нескольким уменьшениям.
Завершив использование объекта семафора, вызовите функцию CloseHandle, чтобы закрыть дескриптор. Объект семафора уничтожается при закрытии последнего дескриптора. Закрытие дескриптора не влияет на число семафоров; Таким образом, обязательно вызовите ReleaseSemaphore перед закрытием дескриптора или до завершения процесса. В противном случае ожидающие операции ожидания будут либо истекает или продолжаться неограниченное время ожидания, в зависимости от того, было ли указано время ожидания.
Связанные разделы