Должен ли я разблокировать мьютексы в обработчике очистки?

Пара цитат из мануала.

Цитирую man 3 pthread_mutex_unlock:

Ни одна из функций мьютекса не является точкой отмены, даже pthread_mutex_lock, несмотря на то, что она может приостановить поток на произвольное время. Таким образом, состояние мьютексов в точках отмены предсказуемо, что позволяет обработчикам отмены разблокировать именно те мьютексы, которые необходимо разблокировать, прежде чем поток прекратит выполнение.

Но одним абзацем позже написано, что:

Функции мьютекса не безопасны для асинхронных сигналов. Это означает, что их не следует вызывать из обработчика сигналов. В частности, вызов pthread_mutex_lock или pthread_mutex_unlock из обработчика сигналов может привести к взаимоблокировке вызывающего потока.

Итак, руководство предписывает мне разблокировать мьютексы в обработчике очистки, но запрещает разблокировать мьютексы в обработчике сигналов. Ну и цитирую man 3 pthread_cancel:

В Linux отмена реализована с помощью сигналов.

Ах. Таким образом, поток отменяется при получении сигнала.

Разве это не делает обработчик очистки отмены на самом деле обработчиком сигнала? Или, может быть, я не знаю, обработчик очистки вызывается из обработчика сигналов, действие которого по умолчанию — вызывать функции, установленные pthread_cleanup_push? Нельзя отрицать, что эти обработчики очистки вызываются при получении сигнала.

Но это сделало бы руководство противоречащим его собственным утверждениям…

Как правильно понимать вещи?


person Community    schedule 14.02.2016    source источник


Ответы (1)


Тот факт, что отмена обрабатывается с помощью сигналов в Linux, является деталью реализации. Это не означает, что вам разрешено использовать в них только функции, безопасные для асинхронных сигналов.

По крайней мере, для отложенной отмены в точке отмены POSIX не ограничивает функции, которые можно вызывать, поэтому реализация должна заставить это работать.

person caf    schedule 14.02.2016