线程4——清理

 

void pthread_cleanup_push(void (*routine)(void *),void *arg);

  第一个参数:指向需要执行的函数   arg为该函数的参数

void pthread_cleanup_pop(int execute);

  int整形数字,非零为执行清理函数

两个函数成对使用

先把函数写进routine里,调用push函数去装routine,然后在用pop让push发挥作用

什么时候会触发push函数?

1、线程结束时,调用pthread_exit()

2、取消线程相应pthread_cancel

3、非零参数调用pthread_cleanup_pop()

 

1     pthread_cleanup_push(cleanup_handler1,(void*)1);
2     pthread_cleanup_push(cleanup_handler2,(void*)2);
3     pthread_cleanup_push(cleanup_handler3,(void*)3);
4     //按照1、2、3函数顺序进行压栈
5 
6     pthread_cleanup_pop(1);
7     pthread_cleanup_pop(1);
8     pthread_cleanup_pop(1);
9     pthread_exit(0);

最先被执行的时handler3,然后handler2 1

 

 

线程清理示例:

 1 void* thread1(void *arg)
 2 {
 3     int *p;
 4     p = (int *)malloc(sizeof(int));
 5         pthread_cleanup_push(cleanup_handler,(void*)3);
 6         pthread_mutex_lock(&lock);
 7         //此线程主要功能代码
 8         //…….
 9         pthread_cleanup_pop(1);
10 
11 }
12 void cleanup_handler (void *arg)
13 {
14     free(arg);
15         pthread_mutex_unlock(&lock);
16 }

 

posted @ 2019-10-14 23:35  祁峰_1024  阅读(182)  评论(0编辑  收藏  举报