Объекты мьютексов служат в качестве базовых элементов низкого уровня, на основе которых можно построить другие функции синхронизации потоков. Поэтому реализация мьютексов должна быть максимально эффективной.
Функции управления мьютексами и, в частности, устанавливаемые по умолчанию значения атрибутов мьютексов позволяют по желанию организовать быстродействующие встроенные реализации блокировок и разблокировок мьютексов.
Например, тупиковая ситуация при двойной блокировке— это явным образом разрешенное поведение, которое позволяет избежать внесения в базовый механизм больших затрат. (Более «дружественные» мьютексы, которые обнаруживают взаимоблокировку или позволяют множественное блокирование одним и тем же потоком, пользователь может легко создать с помощью других механизмов. Например, для регистрации владельцев мьютекса можно использовать функцию pthread_self.) Реализации путем использования специальных атрибутов мьютексов также могут предоставлять дополнительные возможности в виде опций.
Поскольку большинство атрибутов проверяется перед тем, как поток должен быть заблокирован, их использование не замедляет процесс блокирования мьютекса.
Более того, несмотря на возможность выделить идентификационный номер (ID) владельца мьютекса, это потребовало бы сохранения текущего ID потока при каждом блокировании мьютекса, что связано с неприемлемым уровнем затрат. Аналогичные аргументы применимы и к операции mutex_tryunlock.
Будущие направления
Отсутствуют.
Смотри также
pthread_mutex_destroy (), pthread_mutex_timedlock (), то
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования c расширением POSIX Threads Extension.
Issue 6
Функции pthread_mutex_lock (), pthread_mutex_trylock () и pthread_mutex_ unlock () отмечены как часть опции Threads.
В результате согласования со спецификацией Single UNIX Specification было определено поведение при попытке повторно заблокировать мьютекс.
В целях согласования со стандартом IEEE Std 1003.1d-1999 в раздел «Смотри также» была добавлена функция pthread_mutex_timedlock ().
Пр
pthread_mutex_timedlock
Имя
pthread_mutex_timedlock — функция блокировки мьютекса (ADVANCED REALTIME).
Синопсис
THR
#include <pthread.h>
TMO
#include <time.h>
int pthread_mutex_timedlock ( pthread_mutex_t *restrict
Описание
Функция pthread_mutex_timedlock() используется для блокирования объекта мьютекса, адресуемого параметром
Заданный интервал времени истекает, когда наступит абсолютное время, заданное параметром
TMR Если поддерживается опция Timers, отсчет интервала вре
Разрешение для интервала времени определяется разрешением часов, которые используются для его отсчета. Тип данных timespec определяется в заголовке <time. h>.
Ни при каких условиях эта функция не завершится неудачно, если мьютекс может быть заблокирован немедленно. В проверке
У правил наследования приоритета (для мьютексов, инициализированных с использованием протокола PRIO_INHERIT) есть следствие: если ожидание мьютекса, действующего с ограничением по времени, завершается по причине исчерпания заданного интервала времени, то приоритет владельца мьютекса будет откорректирован таким образом, чтобы отражать факт того, что данный поток больше не относится к числу потоков, ожидающих заданный мьютекс.
Возвращаемое значение
При успешном завершении функция pthread_mutex_timedlock() возвращает нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Ошибки
Функция pthread_mutex_timedlock () завершится неудачно, если:
[EINVALJ мьютекс был создан с использованием атрибута
[EINVAL] процесс или поток заблокирован, а пара
[ETIMEDOUT] мьютекс не удалось заблокировать до истечения заданного интервала времени.
Функция pthread_mutex_timedlock () может завершиться неудачно, если:
[EINVAL] значение, заданное пара
[ EDEADLK] текущий поток уже владеет мьютексом.
Эта функция не возвращает код ошибки [EINTR].
Примеры
Отсутствуют.