Осуществить попытку захвата мьютекса
#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 );
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
в случае успешного завершения, либо код ошибки.
PTHREAD_PRIO_PROTECT
, причем приоритет текущего потока превышает допустимое протоколом предельное значение; процесс или поток должны быть заблокированы, причем заданный в наносекундах параметр abs_timeout превышает или равен 1000
миллионов, либо меньше нуля; аргумент mutex не указывает на корректно инициализированный мьютекс. pthread_mutex_timedlock() — POSIX 1003.1 Threads, Timeouts; pthread_mutex_timedlock_monotonic() — ЗОСРВ «Нейтрино»
struct timespec, pthread_mutex_destroy(), pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock()
Предыдущий раздел: Описание API системной библиотеки