sem_timedwait(), sem_timedwait_monotonic()

Ожидать на именованном или безымянном семафоре с заданным тайм-аутом

Прототип:

#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
Указатель на объект sem_t.
abs_timeout
Указатель на struct timespec, который задает максимальное абсолютное время ожидания разблокирования семафора.

Библиотека:

libc

Описание:

Функция sem_timedwait() блокирует семафор, на который ссылается sem, по аналогии с функцией sem_wait(). Если захват семафора невозможен (занят другим потоком), то поток блокируется до освобождения семафора вызовом sem_post() или истечении указанного в abs_timeout таймаута. Время ожидания основано на часах CLOCK_REALTIME.

Функция sem_timedwait_monotonic() - это расширение ЗОСРВ «Нейтрино». Она аналогична sem_timedwait(), но использует CLOCK_MONOTONIC, поэтому на время ожидания не влияет изменение системного времени.

Время ожидания истекает, когда заканчивается абсолютное время abs_timeout, либо если abs_timeout на момент вызова уже истекло.

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

0
Вызывающий процесс успешно выполнил блокировку семафора sem.
-1
Возникла ошибка. Состояние семафора не изменено. Код ошибки записан в errno.

Коды ошибок:

EDEADLK
Обнаружено состояние взаимной блокировки.
EINTR
Вызов прерван сигналом.
EINVAL
Недопустимый дескриптор sem, либо в процессе блокирования потока значение наносекундного поля abs_timeout меньше 0 или ≥ 1000 000 000.
ETIMEDOUT
Семафор не захвачен по истечении таймаута.

Примеры:

#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 системной библиотеки