Обычно pthread_mutex_lock
не может вернуться, пока не получит блокировку, даже если это означает, что он никогда не возвращается (тупик).Однако есть несколько заметных исключений:
- Для рекурсивных мьютексов он может вернуть
EAGAIN
, если будет превышен максимальный счетчик ссылок. - Для мьютексов с проверкой ошибок он можетreturn
EDEADLK
если поток пытается заблокировать мьютекс, он уже удерживает блокировку. - Для надежных мьютексов он может вернуть
EOWNERDEAD
, если другой процесс умер, удерживая (общий) мьютекс.В этом случае, несмотря на получение сообщения об ошибке, вызывающая сторона удерживает блокировку мьютекса и может снова отметить состояние, защищенное мьютексом, путем вызова pthread_mutex_consistent
. - Для надежных мьютексов, владелец которых умер, и для которых новый владелецвызванный
pthread_mutex_unlock
без вызова pthread_mutex_consistent
первым, он вернет ENOTRECOVERABLE
.
Могут быть несколько случаев, которые я пропустил.Обратите внимание, что ни один из них не применим к обычным мьютексам (тип PTHREAD_MUTEX_NORMAL
) без набора надежных атрибутов, поэтому, если вы используете только нормальные мьютексы, вы можете разумно предположить, что вызов никогда не завершится без успеха.