Инициализация безымянного семафора
#include <semaphore.h>int sem_init( sem_t *sem,int pshared,unsigned value );
sem_t
, который необходимо инициализировать.0
соответствует заблокированому семафору, положительное значение разблокированному. Значение не должно превышать SEM_VALUE_MAX
.libc
Функция sem_init() инициализирует безымянный семафор, на который ссылается аргумент sem. Начальное значение счетчика семафора задается аргументом value.
![]() | Следует выделять объекты синхронизации только при обычном мапировании памяти. На некоторых платформах (например, PowerPC), атомарные операции, такие как вызовы pthread_mutex_lock(), могут вызвать ошибку, если структура семафора будет выделена в некэшированной памяти. |
Вы можете использовать инициализированный семафор в последующих вызовах sem_wait(), sem_trywait(), sem_post() и sem_destroy(). Инициализированный семафор функционален до тех пор, пока он не будет уничтожен функцией sem_destroy() или пока память, в которой находится семафор, не будет освобождена. Если аргумент pshared ненулевой, то семафор может быть разделен между процессами через общую память. В этом случае любой процесс может использовать sem с помощью функций sem_wait(), sem_trywait(), sem_post() и sem_destroy().
![]() | Не смешивайте операции ( sem_open() и sem_close()) совместно с операциями (sem_init() и sem_destroy()) над одним и тем же семафором. |
SEM_VALUE_MAX
. POSIX 1003.1 Semaphores
Не инициализируйте один и тот же семафор более чем из одного потока. Лучше настроить семафоры до запуск какого-либо потока.
errno, sem_destroy(), sem_post(), sem_trywait(), sem_wait()
Предыдущий раздел: Описание API системной библиотеки