sem_init()

Инициализация безымянного семафора

Прототип:

#include <semaphore.h>
int sem_init( sem_t *sem,
int pshared,
unsigned value );

Аргументы:

sem
Указатель на семафор sem_t, который необходимо инициализировать.
pshared
Ненулевое значение, если семафор должен быть доступен нескольким процессам через разделяемую память.
value
Начальное значение семафора. 0 соответствует заблокированому семафору, положительное значение разблокированному. Значение не должно превышать SEM_VALUE_MAX.

Библиотека:

libc

Описание:

Функция sem_init() инициализирует безымянный семафор, на который ссылается аргумент sem. Начальное значение счетчика семафора задается аргументом value.


Caution: Следует выделять объекты синхронизации только при обычном мапировании памяти. На некоторых платформах (например, PowerPC), атомарные операции, такие как вызовы pthread_mutex_lock(), могут вызвать ошибку, если структура семафора будет выделена в некэшированной памяти.

Вы можете использовать инициализированный семафор в последующих вызовах sem_wait(), sem_trywait(), sem_post() и sem_destroy(). Инициализированный семафор функционален до тех пор, пока он не будет уничтожен функцией sem_destroy() или пока память, в которой находится семафор, не будет освобождена. Если аргумент pshared ненулевой, то семафор может быть разделен между процессами через общую память. В этом случае любой процесс может использовать sem с помощью функций sem_wait(), sem_trywait(), sem_post() и sem_destroy().


Note: Не смешивайте операции ( sem_open() и sem_close()) совместно с операциями (sem_init() и sem_destroy()) над одним и тем же семафором.

Возвращаемое значение:

0
Успешное завершение. Семафор, описываемый аргументом sem, успешно инициализирован.
-1
Ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
Ресурс, необходимый для инициализации семафора, был исчерпан.
EBUSY
Семафор был ранее инициализирован и не был уничтожен.
EINVAL
Аргумент value превышает SEM_VALUE_MAX.
EPERM
Процесс не имеет прав для инициализации семафора.
ENOSPC
Ресурс, необходимый для инициализации семафора, исчерпан.
ENOSYS
Функция sem_init() не поддерживается.

Классификация:

POSIX 1003.1 Semaphores

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

Не инициализируйте один и тот же семафор более чем из одного потока. Лучше настроить семафоры до запуск какого-либо потока.

Тематические ссылки:

errno, sem_destroy(), sem_post(), sem_trywait(), sem_wait()




Предыдущий раздел: Описание API системной библиотеки