4.3.1. Обработчики очистки
4.3.1. Обработчики очистки
Функции очистки ключей гарантируют, что в случае завершения или отмены потока не произойдет потерн ресурсов. Но иногда возникает необходимость в создании функции, которая будет связана не с ключом, дублируемым между потоками, а с обычным ресурсом. Такая функция называется обработчиком очистки.
Обработчик очистки вызывается при завершении потока. Он принимает один аргумент типа void*, который передается обработчику при его регистрации. Это позволяет использовать один и тот же обработчик для удаления нескольких экземпляров ресурса.
Обработчик очистки — это временная мера, требуемая только тогда, когда поток завершается или отменяется, не закончив выполнять определенный участок кода. При нормальных обстоятельствах ресурс должен удаляться явно.
Для регистрации обработчика следует вызвать функцию pthread_cleanup_push(), передав ей указатель на обработчик и значение его аргумента. Каждому такому вызову должен соответствовать вызов функции pthread_cleanup_pop(), которая отменяет регистрацию обработчика. Для удобства эта функция принимает дополнительный целочисленный флаг. Если он не равен нулю, при отмене регистрации выполняется операция очистки.
В листинге 4.8 показан фрагмент программы, в котором обработчик очистки применяется для удаления динамического буфера при завершении потока.
Листинг 4.8. (cleanup.c) Фрагмент программы, содержащий обработчик очистки потока
#include <malloc.h>
#include <pthread.h>
/* Выделение временного буфера. */
void* allocate_buffer(size_t size) {
return malloc(size);
}
/* Удаление временного буфера. */
void deallocate_buffer(void* buffer) {
free(buffer);
}
void do_some_work() {
/* Выделение временного буфера. */
void* temp_buffer = allocate_buffer(1024);
/* Регистрация обработчика очистки для данного буфера. Этот
обработчик будет удалять буфер при завершении или отмене
потока. */
pthread_cleanup_push(deallocate_buffer, temp_buffer);
/* Выполнение других действий... */
/* Отмена регистрации обработчика. Поскольку функции передается
ненулевой аргумент, она выполняет очистку, вызывая функцию
deallocate_buffer(). */
pthread_cleanup_pop(1);
}
В данном случае функции pthread_cleanup_pop() передается ненулевой аргумент, поэтому функция очистки deallocate_buffer() вызывается автоматически. В данном простейшем случае можно было в качестве обработчика непосредственно использовать стандартную библиотечную функцию free().
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
10.4. Обработчики сигналов в действии
10.4. Обработчики сигналов в действии Множество осложнений и отклонений обнаруживается после установки на место обработчика, после его вызова и впоследствии
Исключения и обработчики исключений
Исключения и обработчики исключений В отсутствие обработки исключений возникновение любой нестандартной ситуации, например, попытки разыменования нулевого указателя или деления на ноль, приведет к немедленному прекращению выполнения программы. В качестве примера,
Обработчики завершения
Обработчики завершения Обработчики завершения служат в основном тем же целям, что и обработчики исключений, но выполняются, когда поток покидает блок в результате нормального выполнения программы, а также когда возникает исключение. С другой стороны, обработчик
Обработчики управляющих сигналов консоли
Обработчики управляющих сигналов консоли Обработчики исключений могут реагировать на самые разнообразные события, но они не в состоянии обнаруживать такие ситуации, как выход пользователя из системы или нажатие комбинации клавиш <Ctrl+C> на клавиатуре с целью
Обработчики прерываний
Обработчики прерываний Функция, которую выполняет ядро в ответ на определенное прерывание, называется обработчиком прерывания (interrupt handler) или подпрограммой обслуживания прерывания (interrupt service routine). Каждому устройству, которое генерирует прерывания, соответствует свой
Совместно используемые обработчики
Совместно используемые обработчики Совместно используемые (shared) обработчики выполняются практически так же, как и не совместно используемые. Существует, однако, три главных отличия.• Флаг SA_SHIRQ должен быть установлен в параметре flags при вызове функции
Функции-обработчики
Функции-обработчики Не все вызовы обработчиков соответствуют клиентским сообщениям. Некоторые из них синтезируются ядром, а некоторые — библиотекой.Я организовал этот раздел следующим образом:• общие замечания;• замечания о функциях установления
Обработчики прерываний
Обработчики прерываний Обработчики прерываний в QNX4 могли либо возвратить идентификатор прокси (указывая этим, что надо переключить прокси и таким образом уведомить ее владельца о прерывании), либо возвратить нуль (что означало бы, что в дальнейшем ничего делать не
Добавляем обработчики событий
Добавляем обработчики событий Главная техника, которую мы используем, чтобы сохранить наш JavaScript «ненавязчивым», — это хранение скрипта в отдельном файле, что предпочтительней, чем смешивать его с разметкой страницы. Чтобы исполнить функции в нашем .js-файле, нам надо
22.3.6. Режимы состязаний и обработчики сигналов
22.3.6. Режимы состязаний и обработчики сигналов Всякий раз когда взломщик может заставить программу вести себя неправильно, появляется потенциальная возможность для злоумышленной эксплуатации. Ошибки, кажущиеся безобидными, вроде двукратного освобождения одной и той же
Мастер очистки Рабочего стола
Мастер очистки Рабочего стола По умолчанию Мастер очистки Рабочего стола запускается через каждые 60 дней. Чтобы изменить число дней между запусками мастера, нужно в разделе HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerDesktopCleanupWizизменить параметр типа DWORD °Days between clean° up Если вы хотите
1.1.9. Обработчики событий
1.1.9. Обработчики событий Обработчики события методы объекта. Это означает, что они должны быть методами класса, а не обычной процедурой или функцией (первый параметр должен быть Self). Для наиболее употребимых обработчиков предназначен следующий тип:TNotifyEvent = procedure(sender: TObject)
Обработчики прерываний
Обработчики прерываний Везде, кроме последней главы, все, что мы пока делали в ядре, сводилось к запросам и ответам разным процессам или работали со специальными файлом, посылали ioctl или выдавали системный вызов. Но работа ядра не должна сводится только к обработке
Программы очистки жесткого диска
Программы очистки жесткого диска Говорят, что жесткий диск – зеркало души пользователя. Файлы у нерях всегда разбросаны как попало, «чайники» вообще с трудом представляют, что и где у них вообще может находиться… И лишь у опытных пользователей все разложено по полочкам,
Пример 2-1. cleanup: Сценарий очистки лог-файлов в /var/log
Пример 2-1. cleanup: Сценарий очистки лог-файлов в /var/log # cleanup# Для работы сценария требуются права root.cd /var/logcat /dev/null > messagescat /dev/null > wtmpecho "Лог-файлы очищены."Здесь нет ничего необычного, это простая последовательность команд, которая может быть набрана в командной строке с
Проблема очистки диска в Windows XP
Проблема очистки диска в Windows XP Во время работы за компьютером на жестком диске накапливается большое количество ненужной информации. Это всевозможные временные файлы, скачанные из Интернет веб-страницы, а также не используемые файлы приложений. Чем больше программ вы