Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Семафоры






Семафор является более сложным объектом. В нем хранится переменная целого типа, которая может принимать значения от 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.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.