Pthread_cleanup用于注册线程清理函数,注册的清理函数将在线程被取消或者主动调用pthread_exit时被调用;
一个简单的示例:
#include <pthread.h> #include <stdio.h>
// pthread_cleanup_push and pthread_cleanup_pop should be called in pairs at the same lexical nesting level // they are implemented with '{' '}'
// pthread_cleanup_pop with non-zero argument/pthread_cancel/pthread_exit // will cause the remained handler to be popped and executed
#define ERROR printf("error @ %s line %d\n", __FILE__, __LINE__ );
void thread_cleanup( void *arg ) { // __func__ can be used instead printf("%s is called\n", __FUNCTION__ ); }
void* threadfn( void *data ) { pthread_cleanup_push( thread_cleanup, NULL );
// sleep是一个可以执行线程取消的函数,称为取消点【see man 7 pthreads】; sleep( 20 );
pthread_cleanup_pop( 1 ); }
int main(int argc, char const *argv[]) { pthread_t thread;
if ( pthread_create( &thread, NULL, threadfn, NULL) ) { ERROR; return -1; }
sleep( 1 );
// cancel the thread before it exits if( pthread_cancel( thread ) ) { ERROR; return -1; }
// wait for thread to complete it's cleanup if( pthread_join( thread, NULL ) ) { ERROR; return -1; }
printf("Done!\n");
return 0; } |