![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Семафоры
Семафор является более сложным объектом. В нем хранится переменная целого типа, которая может принимать значения от 0 до некоторого заданного максимально значения. Семафор занят, если значение его переменной равно 0 и свободен, если оно больше нуля. У объектов семафор всегда присутствует побочный эффект ожидания – успешный вызов Wait-функции на семафоре обязательно уменьшает значение счетчика на 1. Такой объект удобно использовать, если мы хотим учитывать число каких-либо ресурсов. Например, у нас есть процесс-сервер, в памяти которого есть место для хранения 5 клиентских запросов. При помещении запросов в память сервера клиенты будут увеличивать счетчик семафора на 1, и он будет отражать число запросов в буфере. Более 5 запросов поместить не удастся, поскольку клиент не сможет увеличить счетчик семафора. Поток сервера может использовать ожидание на семафоре для того, чтобы определить есть ли у него работа: если счетчик равен нулю (запросов нет) поток будет находиться в состоянии ожидания, а если запросы есть – семафор свободен и сервер сможет начать их обработку. Объект ядра семафор создается вызовом функции CreateSemaphore: HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD LONG lInitialCount, // initial count LONG lMaximumCount, // maximum count LPCTSTR lpName // object name ); С помощью параметров lInitialCount и lMaximumCount мы задаем соответственно начальное и максимальное значения счетчика. Получить доступ к именованному семафору мы можем с помощью функции OpenSemaphore. Значение счетчика семафора можно увеличивать с помощью функции ReleaseSemaphore: BOOL ReleaseSemaphore( HANDLE hSemaphore, // handle to semaphore LONG lReleaseCount, // count increment amount LPLONG lpPreviousCount // previous count ); В переменной lReleaseCount мы задаем значение, на которое необходимо увеличить счетчик семафора. Это число должно быть больше нуля (функция не может уменьшать счетчик). Кроме того, для успешного завершения этой функции необходимо, чтобы новое значение счетчика не превысило максимального значения. Если сумма текущего значения и lReleaseCount больше максимального, то счетчик не изменяется и функция возвращает значение FALSE. Значение счетчика перед изменением помещается в переменную, на которую указывает параметр lpPreviousCount. В нашем примере клиент мог бы использовать его, чтобы определить в какую именно область памяти он должен записать свой запрос. Если это значение не требуется, то можно передать функции указатель NULL.
|