Книга: Программирование для Linux. Профессиональный подход
4.3.1. Обработчики очистки
4.3.1. Обработчики очистки
Функции очистки ключей гарантируют, что в случае завершения или отмены потока не произойдет потерн ресурсов. Но иногда возникает необходимость в создании функции, которая будет связана не с ключом, дублируемым между потоками, а с обычным ресурсом. Такая функция называется обработчиком очистки.
Обработчик очистки вызывается при завершении потока. Он принимает один аргумент типа void*
, который передается обработчику при его регистрации. Это позволяет использовать один и тот же обработчик для удаления нескольких экземпляров ресурса.
Обработчик очистки — это временная мера, требуемая только тогда, когда поток завершается или отменяется, не закончив выполнять определенный участок кода. При нормальных обстоятельствах ресурс должен удаляться явно.
Для регистрации обработчика следует вызвать функцию pthread_cleanup_push()
, передав ей указатель на обработчик и значение его аргумента. Каждому такому вызову должен соответствовать вызов функции pthread_cleanup_pop()
, которая отменяет регистрацию обработчика. Для удобства эта функция принимает дополнительный целочисленный флаг. Если он не равен нулю, при отмене регистрации выполняется операция очистки.
В листинге 4.8 показан фрагмент программы, в котором обработчик очистки применяется для удаления динамического буфера при завершении потока.
- Обработчики завершения
- Исключения и обработчики исключений
- Инфобизнес «на пальцах», Или послесловие для прочистки мозгов, мотивации и небольшого послевкусия
- Обработчики прерываний
- 10.4. Обработчики сигналов в действии
- Стандартные предобработчики
- Совместно используемые обработчики
- Какие обработчики нижних половин необходимо использовать
- Спин-блокировки и обработчики нижних половин
- Обработчики управляющих сигналов консоли
- Обработчики завершения: завершение процессов и потоков
- Обработчики действий