问题:有时候希望线程退出时能够自动的执行某些函数,为了能达到此目的,OS 提供了两个函数帮我们完成这个功能:
void pthread_cleanup_push(void (*rtn)(void*), void *arg);
void pthread_cleanup_pop(int execute);
pthread_cleanup_push是清理注册函数
pthread_cleanup_pop是执行函数,只有里面的参数execute=1才会执行
有以下几种情形,线程清理函数会被调用
有三种情况线程清理函数会被调用:
- 线程还未执行 pthread_cleanup_pop 前,被 pthread_cancel 取消
- 线程还未执行 pthread_cleanup_pop 前,主动执行 pthread_exit 终止
- 线程执行 pthread_cleanup_pop,且 pthread_cleanup_pop 的参数不为 0.
注意:如果线程还未执行 pthread_cleanup_pop 前通过 return 返回,是不会执行清理函数的
程序源码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void *clean_up(void *arg)
{
char *s= (char *)arg;
printf("clean_func : %s\n",s);
return (void *)0;
}
void * th_fn(void *arg)
{
int execute=(int)arg;
pthread_cleanup_push(clean_up,"first func clean");
pthread_cleanup_push(clean_up,"second func clean");
printf("%lx thread is running\n",pthread_self());
pthread_exit((void*)0);//测试上面说的调用情况
pthread_cleanup_pop(execute);
pthread_cleanup_pop(execute);
return (void*)50;//你认为调用pthread_join获取的返回值是50还是0呢???
}
int main(void)
{
int err;
pthread_t rabbit,turtle;
if((err=pthread_create(&rabbit,NULL,th_fn,(void *)1))!=0)
{
perror("pthread_create error");
}
if((err=pthread_create(&turtle,NULL,th_fn,(void *)1))!=0)
{
perror("pthread_create error");
}
int result;
pthread_join(rabbit,(void *)&result);
printf("rabbit result:%d\n",result);
pthread_join(turtle,(void *)&result);
printf("turtle result:%d\n",result);
printf("control thread id: %lx\n",pthread_self());
printf("finished!\n");
return 0;
}
实验现象:
7fd0156d9700 thread is running
clean_func : second func clean
clean_func : first func clean
7fd015eda700 thread is running
clean_func : second func clean
clean_func : first func clean
rabbit result:0
turtle result:0
control thread id: 7fd0166dd700
finished!