Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 439

Описание

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

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

TMR Если поддерживается опция Timers, отсчет интервала вре м ени проис ходит с использованием часов CLOCK_REALTIME; в противном случае — с использованием системных часов, значение которых возвращает функция time ().

Разрешение для интервала времени определяется разрешением часов, которые используются для его отсчета. Тип данных timespec определяется в заголовке .

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

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

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

При успешном завершении функция pthread_mutex_timedlock() возвращает нулевое значение; в противном случае — код ошибки, обозначающий ее характер.

Ошибки

Функция pthread_mutex_timedlock () завершится неудачно, если:

[EINVALJ  мьютекс был создан с использованием атрибута protocol, и м еющего значение PTHREAD_PRIO_PROTECT, а приоритет вызывающего потока выше текущего значения предельного приоритета м ьютекса;

[EINVAL]  процесс или поток заблокирован, а пара м етр abs_timeout в поле наносекунд и м еет значение, которое м еньше нуля либо больше или равно 1000 млн;

[ETIMEDOUT] мьютекс не удалось заблокировать до истечения заданного интервала времени.

Функция pthread_mutex_timedlock () может завершиться неудачно, если: