PTHREAD_CLEANUP_PUSH_DEFER_NP(3) | Руководство программиста Linux | 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():
Эти функции работают также как 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)
2017-09-15 | Linux |