Linux多线程(三)线程清理函数

问题:有时候希望线程退出时能够自动的执行某些函数,为了能达到此目的,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!

猜你喜欢

转载自blog.csdn.net/qq_38211852/article/details/80345501