Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

4.3 Семафоры

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

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

Функции для работы с семафорами — CreateSemaphore, OpenSemaphore и ReleaseSemaphore, которые могут увеличить счетчик на 1 или большее число. Эти функции похожи на свои аналоги для мьютексов.

HANDLE CreateSemaphore ( LPSECURITY_ATTRIBUTES lpsa,

LONG cSemInitial, LONG cSemMax, LPCTSTR lpszSemName)

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

Уменьшить счетчик на 1 можно любой функцией ожидания, но освобождение се­мафора может увеличить его значение на любое число вплоть до максимума.

BOOL ReleaseSemaphore ( HANDLE hSemaphore,

LONG cReleaseCount, LPLONG lpPreviousCount)

Отметим, что вы можете определить и предыдущее значение счетчика, но если та­кой необходимости нет, указатель lpPreviousCount может иметь значение NULL.

Счетчик освобождения должен быть больше нуля, но если это заставит семафор превысить максимально возможное значение, то функция не выполнится, возвратит значение FALSE и счетчик останется не измененным. Освобождение семафора с большим значени­ем счетчика является способом получения текущего значения его счетчика в одной опера­ции (конечно же, это значение немедленно может изменить другой поток).

Мнение о семафоре как о мьютексе с максимальным значением 1 было бы оши­бочным, так как семафор не может иметь владельца. Семафор может освободить лю­бой поток, а не только тот, который выполнит ожидание. Более того, так как нет вла­дения семафором, он не может быть покинут.

Использование семафоров

Классическое приложение семафоров относится к использованию их счетчиков как представления числа доступных ресурсов, таких как число сообщений, ожидающих в очереди. Максимум семафора соответствует максимальной длине очереди. Таким обра­зом, производитель поместит в буфер и вызовет функцию ReleaseSemaphore, обычно со значением счетчика освобождения 1. Потоки-потребители будут выполнять ожидание для семафора, получая сообщения и уменьшая счетчик семафора.

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

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

Лекция 5. Тема: Дополнительные методы синхронизации потоков

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]