
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
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. Тема: Дополнительные методы синхронизации потоков