Параллельное и распределенное программирование на С++
Шрифт:
Если м ьютекс и м еет тип PTHREAD_MUTEX_DEFAULT, попытка рекурсивно заблокировать мьютекс приводит к неопределенному поведению. Попытка разблокировать мьютекс, который не был заблокирован (любым потоком, включал вызывающий), приводит к неопределенному поведению.
Функция pthread_mutex_trylock эквивалентна функции
pthread_mutex_lock , за исключением того, что если объект мьютекса, адресуемый параметром mutex, в данный момент заблокирован (любым потоком, включал текущий),
Функция pthread_mutex_unlock освобождает объект м ьютекса, адресуе м ый пара м етро м mutex.
XSI Способ освобождения зависит от атрибута типа м ьютекса.
Если при вызове функции pthread_mutex_unlock , в результате которого мьютекс стал доступным, существуют потоки, заблокированные по объекту мьютекса, адресуемому параметром мьютекс, то поток-владелец этого мьютекса будет установлен стратегией планирования. XSI
(Для м ьютексов типа PTHREAD_MUTEX_RECURS IVE: м ьютекс становится доступным, когда счетчик блокировок достигает нуля, и вызывающий поток больше не имеет никаких блокировок по этому мьютексу.)
Если к потоку, ожидающему освобождения мьютекса, поступает сигнал, то после выполнения обработчика этого сигнала поток снова перейдет в состояние ожидания, как если бы он и не прерывался на обработку сигнала.
Возвращаемые значения
При успешном завершении функции pthread_mutex_lock npthread_mutex_unlock возвращают нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Функция pthread_mutex_trylock возвращает нулевое значение, если выполнена блокировка по объекту мьютекса, адресуемому параметром mutex. В противном случае возвращается код ошибки, обозначающий ее характер.
Ошибки
Функции pthread_mutex_lock и pthread_mutex_trylock завершатся неудачно, если:
[EINVAL] мьютекс был создан с использованием атрибута protocol, имеющего значение PTHREAD_PRIO_PROTECT, а приоритет вызывающего потока выше текущего значения предельного приоритета мьютекса.
Функция pthread_mutex_trylock завершится неудачно, если:
[EBUSY] мьютекс остался недоступным, поскольку он был уже заблокирован.
Функции pthread_mutex_lock , pthread_mutex_trylock
и pthread_mutex_unlock м огут завершиться неудачно, если:
[EINVAL] значение, заданное пара м етро м mutex, не относится к инициализированно м
XSI [EAGAIN] мьютекс остался недоступным, поскольку было превышено максимальное количество рекурсивных блокировок для мью-текса, заданного параметром mutex.
Функция pthread_mutex_lock м ожет завершиться неудачно, ес л и:
[ EDEADLK ] текущий поток уже владеет мьютексом.
Функция pthread_mutex_unlock м ожет завершиться неудачно, ес л и:
[ EPERM ] текущий поток не владеет мьютексом.
Эти функции не возвра щ ают код ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
Отсутствуют.
Логическое обоснование
Объекты мьютексов служат в качестве базовых элементов низкого уровня, на основе которых можно построить другие функции синхронизации потоков. Поэтому реализация мьютексов должна быть максимально эффективной.
Функции управления мьютексами и, в частности, устанавливаемые по умолчанию значения атрибутов мьютексов позволяют по желанию организовать быстродействующие встроенные реализации блокировок и разблокировок мьютексов.
Например, тупиковая ситуация при двойной блокировке— это явным образом разрешенное поведение, которое позволяет избежать внесения в базовый механизм больших затрат. (Более «дружественные» мьютексы, которые обнаруживают взаимоблокировку или позволяют множественное блокирование одним и тем же потоком, пользователь может легко создать с помощью других механизмов. Например, для регистрации владельцев мьютекса можно использовать функцию pthread_self.) Реализации путем использования специальных атрибутов мьютексов также могут предоставлять дополнительные возможности в виде опций.
Поскольку большинство атрибутов проверяется перед тем, как поток должен быть заблокирован, их использование не замедляет процесс блокирования мьютекса.
Более того, несмотря на возможность выделить идентификационный номер (ID) владельца мьютекса, это потребовало бы сохранения текущего ID потока при каждом блокировании мьютекса, что связано с неприемлемым уровнем затрат. Аналогичные аргументы применимы и к операции mutex_tryunlock.
Будущие направления
Отсутствуют.
Смотри также
pthread_mutex_destroy , pthread_mutex_timedlock , то м Base Definitions стандарта IEEE Std 1003.1-2001, <pthread.h>.
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования c расширением POSIX Threads Extension.
Issue 6
Функции pthread_mutex_lock , pthread_mutex_trylock и pthread_mutex_ unlock отмечены как часть опции Threads.