Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OS_chast_2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.55 Mб
Скачать

Семафоры.

Объект «семафор» в ОС Windows описывается объектом ядра Semaphore. Семафор находится в сигнальном состоянии, если его значение, называемое счетчиком семафора, больше нуля. В противном случае, семафор находится в несигнальном состоянии. Потоки, ожидающие сигнального состояния семафора, выстраиваются в очередь к нему, и обслуживаются в соответствии с дисциплиной FIFO. Если какой-либо из этих потоков ожидает наступления асинхронного события, то функции ядра могут исключить поток из очереди к семафору для обслуживания этого события (при его наступлении). После этого поток переводится в конец очереди к семафору.

Семафоры создаются вызовом функции CreateSemaphore (ps1, ps2, ps3, ps4).

  • ps1 определяет атрибуты защиты объекта;

  • ps2 определяет начальное значение счетчика семафора, которое должно быть не меньше нуля, и не больше его максимального значения, которое задается параметром ps3.

  • ps4 задает имя семафора, либо может иметь значение пустой строки. В этом случае создается безымянный семафор.

В случае успешного завершения возвращается Handle созданного объекта, и ноль – в противном случае. Если семафор с заданным именем уже существует, то функция возвращает дескриптор ранее созданного семафора, а GetLastError возвращает ERROR_ALREADY_EXISTS.

Значение счетчика семафора уменьшается на единицу при его использовании в функции ожидания. Увеличить значение счетчика можно путем вызова ReleaseSemaphore(Handle, pr2, pr3).

  • Handle – дескриптор семафора;

  • pr2 – целое положительное число, на которое увеличивается значение семафора;

  • pr3 – предыдущее значение семафора.

В случае успешного завершения, функция возвращает ненулевое значение, и нулевое – в противном случае.

Если значение счетчика семафора в сумме с pr2 оказывается больше ps3, то данная функция ReleaseSemaphore возвращает ноль, и значение счетчика не меняется.

Доступ к существующему семафору можно открыть либо путем вызова CreateSemaphore (ps1, ps2, ps3, ps4), либо вызова OpenSemaphore(po1, po2, po3).

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

Функция OpenSemaphore используется в случае, когда заранее известно, что семафор с заданным именем уже существует. Параметры аналогичны параметрам OpenEvent.

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

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

В обратной ситуации, поток, производящий ресурсы, работает быстрее, чем потребитель. Он создаст все ресурсы, и завершит свою работу, не дожидаясь момента, пока другой поток использует их. Такая синхронизация между потоками-производителями и потребителями будет обеспечивать их максимально быструю взаимную работу.

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