Пара цитат из мануала.
Цитирую man 3 pthread_mutex_unlock
:
Ни одна из функций мьютекса не является точкой отмены, даже pthread_mutex_lock, несмотря на то, что она может приостановить поток на произвольное время. Таким образом, состояние мьютексов в точках отмены предсказуемо, что позволяет обработчикам отмены разблокировать именно те мьютексы, которые необходимо разблокировать, прежде чем поток прекратит выполнение.
Но одним абзацем позже написано, что:
Функции мьютекса не безопасны для асинхронных сигналов. Это означает, что их не следует вызывать из обработчика сигналов. В частности, вызов pthread_mutex_lock или pthread_mutex_unlock из обработчика сигналов может привести к взаимоблокировке вызывающего потока.
Итак, руководство предписывает мне разблокировать мьютексы в обработчике очистки, но запрещает разблокировать мьютексы в обработчике сигналов. Ну и цитирую man 3 pthread_cancel
:
В Linux отмена реализована с помощью сигналов.
Ах. Таким образом, поток отменяется при получении сигнала.
Разве это не делает обработчик очистки отмены на самом деле обработчиком сигнала? Или, может быть, я не знаю, обработчик очистки вызывается из обработчика сигналов, действие которого по умолчанию — вызывать функции, установленные pthread_cleanup_push
? Нельзя отрицать, что эти обработчики очистки вызываются при получении сигнала.
Но это сделало бы руководство противоречащим его собственным утверждениям…
Как правильно понимать вещи?