Ожидать на именованном или безымянном семафоре с заданным тайм-аутом
#include <semaphore.h>#include <time.h>int sem_timedwait( sem_t *sem,const struct timespec *abs_timeout );int sem_timedwait_monotonic( sem_t *sem,const struct timespec *abs_timeout );
sem_t
.libc
Функция sem_timedwait() блокирует семафор, на который ссылается sem, по аналогии с функцией sem_wait(). Если захват семафора невозможен (занят другим потоком), то поток блокируется до освобождения семафора вызовом sem_post() или истечении указанного в abs_timeout таймаута. Время ожидания основано на часах CLOCK_REALTIME
.
Функция sem_timedwait_monotonic() - это расширение ЗОСРВ «Нейтрино». Она аналогична sem_timedwait(), но использует CLOCK_MONOTONIC
, поэтому на время ожидания не влияет изменение системного времени.
Время ожидания истекает, когда заканчивается абсолютное время abs_timeout, либо если abs_timeout на момент вызова уже истекло.
0
или ≥ 1000 000 000
. #include <stdio.h>#include <semaphore.h>#include <time.h>void main(){struct timespec tm;sem_t sem;int i = 0;sem_init( &sem, 0, 0 );do {clock_gettime( CLOCK_REALTIME, &tm );tm.tv_sec += 1;i++;printf( "i=%d\n", i );if ( i == 10 ){sem_post( &sem );}} while ( sem_timedwait( &sem, &tm ) == -1 );printf( "Semaphore acquired after %d timeouts\n", i );return;}
sem_timedwait() — POSIX 1003.1 Semaphores, Timeouts; sem_timedwait_monotonic() — ЗОСРВ «Нейтрино»
sem_post(), sem_trywait(), sem_wait(), time(), struct timespec
Предыдущий раздел: Описание API системной библиотеки