#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void cleanup( void *arg )
{
printf( "cleanup : %s\n", (char *)arg );
}
void * thr_fn1( void *arg )
{
printf( "thread 1 start\n" );
pthread_cleanup_push( cleanup, "thread 1 first handler" );
pthread_cleanup_push( cleanup, "thread 1 second handler" );
printf( "thread 1 push complete\n" );
//pthread_exit( NULL );
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
}
int main(void)
{
pthread_t tid1, tid2;
int err;
void *tret;
err = pthread_create( &tid1, NULL, thr_fn1, NULL );
if( err != 0 )
printf( "can't create thread 1 : %s\n", strerror( err ) );
err = pthread_join( tid1, &tret );
if( err != 0 )
printf( "can't joint thread 1 %s\n", strerror( err ) );
printf( "thread 1 exit code %d\n",(int)tret );
exit( 0 );
}
当线程执行以下动作时调用清理函数,调用参数为arg
1、调用pthread_exit;
2\相应取消请求时
3、用非零参数调用pthread_cleanup_pop时。
如果线程是通过它的启动例程中返回的而终止的话,那么它的清理处理程序就不会调用。
该程序执行的结果如下所示:
wangkai@ubuntu:~/Test$ ./a.out
thread 1 start
thread 1 push complete
cleanup : thread 1 second handler
cleanup : thread 1 first handler
thread 1 exit code 33