Если вы создали надежный мьютекс, установив правильные атрибуты перед вызовом pthread_mutex_init
, мьютекс войдет в особое состояние, когда поток, содержащий блокировку, завершится, и следующий поток, который попытается получить мьютекс, получитошибка EOWNERDEAD
.Затем он отвечает за очистку любого состояния, которое защищает мьютекс, и вызывает pthread_mutex_consistent
, чтобы сделать мьютекс снова пригодным для использования, или вызывает pthread_mutex_unlock
(что сделает мьютекс навсегда непригодным для использования; дальнейшие попытки его использования вернут ENOTRECOVERABLE
).
Для не устойчивых мьютексов мьютекс постоянно недоступен, если поток, заблокировавший его, завершается без разблокировки.В соответствии со стандартом (см. Разрешение на выпуск 755 на трекере Austin Group) мьютекс остается заблокированным, а его формальное владение продолжает принадлежать потоку, который вышел, и любой поток, который пытается заблокировать его, будет взаимоблокировать,Если другой поток пытается разблокировать его, это обычно неопределенное поведение, если мьютекс не был создан с атрибутом PTHREAD_MUTEX_ERRORCHECK
, и в этом случае будет возвращена ошибка.
С другой стороны, многие (большинство?)Реализации реального мира не соответствуют требованиям стандарта.Попытка заблокировать или разблокировать мьютекс из другого потока может быть неожиданно успешной, поскольку идентификатор потока (используемый для отслеживания владения), возможно, использовался повторно и теперь может ссылаться на другой поток (возможно, тот, который выполняет новый запрос блокировки / разблокировки).Известно, что, по крайней мере, NPTL от glibc демонстрирует такое поведение.