PTHREAD_CLEANUP_PUSH_DEFER_NP(3)

ИМЯ
pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np - добавляет и удаляет очищающие обработчики отмены нити при сохранении типа отмены

ОБЗОР
#include <pthread.h>

void pthread_cleanup_push_defer_np(void (*routine)(void *),
                                   void *arg);
void pthread_cleanup_pop_restore_np(int execute);

Компилируется и компонуется вместе с -pthread.

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

pthread_cleanup_push_defer_np(), pthread_cleanup_pop_defer_np():
    _GNU_SOURCE

ОПИСАНИЕ
Эти функции работают также как pthread_cleanup_push(3) и pthread_cleanup_pop(3), за исключением различий, описанных в данной справочной странице.

Подобно pthread_cleanup_push(3), pthread_cleanup_push_defer_np() добавляет routine в стек нити к очищающим обработчикам отмены. Кроме этого, она также сохраняет текущий тип отмены нити, и изменяет тип отмены на «отложенный» (смотрите pthread_setcanceltype(3)); это гарантирует, что очистка при отмене произойдёт даже, если тип отмены нити перед вызовом был «асинхронный».

Подобно pthread_cleanup_pop(3), pthread_cleanup_pop_restore_np() удаляет самый верхний очищающий обработчик из стека нити очищающих обработчиков отмены. Кроме этого, она восстанавливает тип отмены нити в значение на момент, когда была вызвана pthread_cleanup_push_defer_np().

Вызывающий должен гарантировать, что вызовы этих функций будут попарными внутри одной функции, и на одном лексическом уровне вложенности. Остальные ограничения описаны в pthread_cleanup_push(3).

Последовательность вызовов:

    pthread_cleanup_push_defer_np(routine, arg);
    pthread_cleanup_pop_restore_np(execute);

эквивалентна (но короче и эффективнее):

    int oldtype;
    pthread_cleanup_push(routine, arg);
    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
    ...
    pthread_setcanceltype(oldtype, NULL);
    pthread_cleanup_pop(execute);

СООТВЕТСТВИЕ СТАНДАРТАМ
Данные функции являются не стандартизированными расширениями GNU, о чём свидетельствует наличие суффикса «_np» (nonportable).

СМОТРИТЕ ТАКЖЕ
pthread_cancel(3), pthread_cleanup_push(3), pthread_setcancelstate(3), pthread_testcancel(3), pthreads(7)