Добавить на вершину стека вызовов обработчик прерывания потока
#include <pthread.h>void pthread_cleanup_push( void (routine)( void* ),void *arg );
libc
Макрос pthread_cleanup_push() добавляет на вершину стека вызов указанный в routine, который будет играть роль деструктора при операциях прерывания выполнения потока.
Указанный деструктор вызывается с аргументом arg в следующих случаях:
Макрос pthread_cleanup_push() раскрывается препроцессором в виде нескольких строк кода с открывающей скобкой { , но без закрывающей } . Вы должны использовать его в паре с pthread_cleanup_pop(), который и включает закрывающую скобку. |
Использование обработчика прерывания потока для освобождения ресурсов (например, мьютекса) при терминировании потока:
#include <pthread.h>pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void unlock( void *arg ){pthread_mutex_unlock( &lock );}void * function( void *arg ){while( 1 ){pthread_mutex_lock( &lock );pthread_cleanup_push( &unlock, NULL );/* Any of the possible cancellation points could go here. */pthread_testcancel();pthread_cleanup_pop( 1 );}}
POSIX 1003.1 Threads
pthread_cleanup_pop(), pthread_cancel(), pthread_exit()
Предыдущий раздел: Описание API системной библиотеки