pthread_mutex_timedlock(), pthread_mutex_timedlock_monotonic()

Осуществить попытку захвата мьютекса

Прототип:

#include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock( pthread_mutex_t *mutex,
const struct timespec *abs_timeout );
int pthread_mutex_timedlock_monotonic( pthread_mutex_t *mutex,
const struct timespec *abs_timeout );

Аргументы:

mutex
Мьютекс, который необходимо захватить.
abs_timeout
Указатель на struct timespec, определяющую максимально допустимое время ожидания освобождения мьютекса, выраженное в абсолютных значениях.

Библиотека:

libc

Описание:

Функция pthread_mutex_timedlock() производит захват мьютекса, опредлеленного аргументом mutex. Если мьютекс не является свободным, вызывающий поток блокируется до освобождения ресурса по аналогии с функцией pthread_mutex_lock(). Если мьютекс не может быть захвачен без ожидания освобождения мьютекса другим потоком, ожидание будет прервано по истечению заданного аргументом abs_timeout таймаута.

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

При блокировании высокоприоритетного потока на мьютексе, эффективный приориетет низкоприоритетного потока владельца мьютекса временно повышается до уровня наиболее приориетного ожидающего потока. Приоритет потока владельца будет понижен до исходного уровня после разблокировки мьютекса.

Таймаут, заданный аргументом abs_timeout, выражается в абсолютном исчислении времени. В соответствии с используемым источником системного времени это означает, что текущее время должно превышать или быть равным abs_timeout.

Для функции pthread_mutex_timedlock() таймауты основаны на часах CLOCK_REALTIME. Структура struct timespec определена в заголовочном файле <time.h>.

В случае успешного захвата мьютекса аргумент abs_timeout не анализируется и функция прерывается таймаутом.

Как следствие действия правил наследования приоритетов (для мьютексов, инициализированных с протоколом PTHREAD_PRIO_INHERIT), если ожидание мьютекса прекращается из-за истечения таймаута, приоритет владельца мьютекса корректируется по мере необходимости. Это отражает тот факт, что текущий высокоприоритетный поток больше не находится в очереди потоков, ожидающих освобождения ресурса.

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

0 в случае успешного завершения, либо код ошибки.

Коды ошибок:

EAGAIN
Не удалось захватить мьютекс по причине достижения максимального числа рекурсивных блокировок.
EDEADLK
Текущий поток уже владеет мьютексом.
EINTR
(Расширение для ЗОСРВ «Нейтрино») Поток разблокирован посредством вызова pthread_mutex_wakeup_np().
EINVAL
Мьютекс был создан с установленым протоколом PTHREAD_PRIO_PROTECT, причем приоритет текущего потока превышает допустимое протоколом предельное значение; процесс или поток должны быть заблокированы, причем заданный в наносекундах параметр abs_timeout превышает или равен 1000 миллионов, либо меньше нуля; аргумент mutex не указывает на корректно инициализированный мьютекс.
EOWNERDEAD
Владелец мьютекса завершился при захваченном мьютексе.
ETIMEDOUT
Поток не смог осуществить захват мьютекса до истечения указанного таймаута.

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

pthread_mutex_timedlock() — POSIX 1003.1 THR TMO; pthread_mutex_timedlock_monotonic() — ЗОСРВ «Нейтрино»

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

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

struct timespec, pthread_mutex_destroy(), pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock()




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