线程处理函数pthread_cleanup_push / pthread_cleanup_pop

             线程处理函数pthread_cleanup_push / pthread_cleanup_pop

 线程可以安排它退出线程处理函数pthread_cleanup_push / pthread_cleanup_pop时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。

    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:
    1)调用pthread_exit。
    2)作为对取消线程请求(pthread_cancel)的响应。
    3)以非0参数调用pthread_cleanup_pop。
注意:

    1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。

    2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。

名称

pthread_cleanup_push / pthread_cleanup_pop

功能:

线程清理处理程序

头文件:

#include <pthread.h>

函数原形:

void pthread_cleanup_push(void (*rtn)(void *)void *arg);

void pthread_cleanup_pop(int execute);

参数:

rtn处理程序入口地址

arg传递给处理函数的参数

返回值:



 

[cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #include <stdlib.h>    
  3. #include <pthread.h>    
  4. #include <string.h>    
  5.    
  6. void cleanup(void *arg){    
  7.     printf("cleanup: %s/n",(char *)arg);    
  8. }    
  9.    
  10. void *thr_fn1(void *arg){    
  11.     printf("thread 1 start/n");    
  12.     pthread_cleanup_push(cleanup,"thread 1 first handler");    
  13.     pthread_cleanup_push(cleanup,"thread 1 second handler");    
  14.     printf("thread 1 push complete/n");    
  15.     if(arg)    
  16.         return ((void *)1);    
  17.     pthread_cleanup_pop(1);    
  18.     pthread_cleanup_pop(1);    
  19.     return ((void *)1);    
  20. }    
  21.    
  22. void *thr_fn2(void *arg){    
  23.     printf("thread 2 start/n");    
  24.     pthread_cleanup_push(cleanup,"thread 2 first handler");    
  25.     pthread_cleanup_push(cleanup,"thread 2 second handler");    
  26.     printf("thread 2 push complete/n");    
  27.     if(arg){    
  28.         pthread_exit((void *)2);    
  29.     }    
  30.     pthread_cleanup_pop(0);  //取消第一个线程处理程序  
  31.   
  32.     pthread_cleanup_pop(0);  //取消第二个线程处理程序  
  33.    
  34.     pthread_exit((void *) 2);    
  35. }    
  36.    
  37. int main(void){    
  38.     int err;    
  39.     pthread_t tid1,tid2;    
  40.     void *tret;    
  41.    
  42.     err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);    
  43.     if( err != 0){    
  44.         fprintf(stderr,"create thread1 failed: %s",strerror(err));    
  45.         exit(1);    
  46.     }    
  47.    
  48.     err = pthread_create(&tid2,NULL,thr_fn2,(void *)2);    
  49.     if(err != 0){    
  50.         fprintf(stderr,"create thread 2 failed: %s",strerror(err));    
  51.         exit(1);    
  52.     }    
  53.    
  54.     err = pthread_join(tid1,&tret);    
  55.     if(err != 0){    
  56.         fprintf(stderr,"thread1 join failed: %s",strerror(err));    
  57.         exit(1);    
  58.     }    
  59.     printf("thread 1 exit code %d/n",(int)tret);    
  60.     err = pthread_join(tid2,&tret);    
  61.     if(err != 0){    
  62.         fprintf(stderr,"thread2 join failed: %s",strerror(err));    
  63.         exit(1);    
  64.     }    
  65.     printf("thread 2 exit code %d/n",(int) tret);    
  66.     exit(0);     
  67. }   

补充一下: phtread_cleanup_push 与 phread_cleanup_pop要成对儿的出现,否则会报错!!


             线程处理函数pthread_cleanup_push / pthread_cleanup_pop

 线程可以安排它退出线程处理函数pthread_cleanup_push / pthread_cleanup_pop时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。

    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:
    1)调用pthread_exit。
    2)作为对取消线程请求(pthread_cancel)的响应。
    3)以非0参数调用pthread_cleanup_pop。
注意:

    1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。

    2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。

名称

pthread_cleanup_push / pthread_cleanup_pop

功能:

线程清理处理程序

头文件:

#include <pthread.h>

函数原形:

void pthread_cleanup_push(void (*rtn)(void *)void *arg);

void pthread_cleanup_pop(int execute);

参数:

rtn处理程序入口地址

arg传递给处理函数的参数

返回值:



 

[cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #include <stdlib.h>    
  3. #include <pthread.h>    
  4. #include <string.h>    
  5.    
  6. void cleanup(void *arg){    
  7.     printf("cleanup: %s/n",(char *)arg);    
  8. }    
  9.    
  10. void *thr_fn1(void *arg){    
  11.     printf("thread 1 start/n");    
  12.     pthread_cleanup_push(cleanup,"thread 1 first handler");    
  13.     pthread_cleanup_push(cleanup,"thread 1 second handler");    
  14.     printf("thread 1 push complete/n");    
  15.     if(arg)    
  16.         return ((void *)1);    
  17.     pthread_cleanup_pop(1);    
  18.     pthread_cleanup_pop(1);    
  19.     return ((void *)1);    
  20. }    
  21.    
  22. void *thr_fn2(void *arg){    
  23.     printf("thread 2 start/n");    
  24.     pthread_cleanup_push(cleanup,"thread 2 first handler");    
  25.     pthread_cleanup_push(cleanup,"thread 2 second handler");    
  26.     printf("thread 2 push complete/n");    
  27.     if(arg){    
  28.         pthread_exit((void *)2);    
  29.     }    
  30.     pthread_cleanup_pop(0);  //取消第一个线程处理程序  
  31.   
  32.     pthread_cleanup_pop(0);  //取消第二个线程处理程序  
  33.    
  34.     pthread_exit((void *) 2);    
  35. }    
  36.    
  37. int main(void){    
  38.     int err;    
  39.     pthread_t tid1,tid2;    
  40.     void *tret;    
  41.    
  42.     err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);    
  43.     if( err != 0){    
  44.         fprintf(stderr,"create thread1 failed: %s",strerror(err));    
  45.         exit(1);    
  46.     }    
  47.    
  48.     err = pthread_create(&tid2,NULL,thr_fn2,(void *)2);    
  49.     if(err != 0){    
  50.         fprintf(stderr,"create thread 2 failed: %s",strerror(err));    
  51.         exit(1);    
  52.     }    
  53.    
  54.     err = pthread_join(tid1,&tret);    
  55.     if(err != 0){    
  56.         fprintf(stderr,"thread1 join failed: %s",strerror(err));    
  57.         exit(1);    
  58.     }    
  59.     printf("thread 1 exit code %d/n",(int)tret);    
  60.     err = pthread_join(tid2,&tret);    
  61.     if(err != 0){    
  62.         fprintf(stderr,"thread2 join failed: %s",strerror(err));    
  63.         exit(1);    
  64.     }    
  65.     printf("thread 2 exit code %d/n",(int) tret);    
  66.     exit(0);     
  67. }   

补充一下: phtread_cleanup_push 与 phread_cleanup_pop要成对儿的出现,否则会报错!!


猜你喜欢

转载自blog.csdn.net/fly_sky_share/article/details/79048054
今日推荐