7.3.5 Семафоры POSIX

Предыдущая  Содержание  Следующая V*D*V

Семафоры являются счётчиками, совместно используемыми потоками или процессами ресурсов. Основными операциями с семафорами являются:

 

Атомарное увеличение счетчика.

Ожидание, пока счётчик не станет равен нулю, а затем его атомарное уменьшение.

 

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

 

Именованные семафоры: они могут быть использованы для синхронизации между несколькими несвязанными процессами.

Безымянные семафоры: они могут быть использованы потоками внутри процесса или для синхронизации между связанными процессами (например, родительским и дочерним процессом).

 

Семафоры POSIX 1003.1b в Linux реализует библиотека pthread, которая является частью пакета glibc. Glibc 2.3 с NPTL имеет полную поддержку для семафоров, в том числе именованных и используемых разными процессами для доступа к общим ресурсам семафоров. Более ранние версии glibc поддерживали только безымянные семафоры. Операции с семафорами перечислены в Таблице 7.6. Использование именованного семафора иллюстрирует Распечатка 7.11.

 

Таблица 7.6 Функции для работы с семафорами POSIX.1b

 

Метод

Описание

sem_open

Открытие/создание именованного семафора.

sem_close

Закрытие именованного семафора.

sem_unlink

Удаление именованного семафора.

sem_init

Инициализация неименованного семафора.

sem_destroy

Удаление неименованного семафора.

sem_getvalue

Получение текущего значения счётчика семафора.

sem_wait

Выполнение операции блокировки семафора.

sem_trywait

Выполнение операции попытки блокировки семафора.

sem_post

Освобождение семафора.

 

Что следует помнить

 

Семафорная защита работает только между взаимодействующими процессами; то есть процесс должен ждать семафор, если он не доступен, и должен освободить семафор после использования.

Дескриптор семафора передаётся по наследству через ветвление. Дочерним процессам нет необходимости заново открывать семафор. После использования они могут вызвать sem_close.

Функция sem_post является безопасной для передачи асинхронных сигналов и может быть вызвана из обработчиков сигналов.

Может произойти инверсия приоритета, если процесс с низким приоритетом блокирует семафор, необходимый процессу с высоким приоритетом.

 

Предыдущая  Содержание  Следующая