Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1408648
  • 博文数量: 120
  • 博客积分: 182
  • 博客等级: 入伍新兵
  • 技术积分: 2278
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-19 16:31
文章分类

全部博文(120)

文章存档

2015年(12)

2014年(13)

2013年(40)

2012年(55)

分类:

2012-08-03 12:18:54

void pthread_cleanup_push(void (*routine)(void*), void *arg);
void pthread_cleanup_pop(int execute);//这里的int参数,0是不执行push的内容,非0是执行。

原型很简单,功能跟atexit()差不多,只不过一个是线程一个是进程。
用来设置在push/pop内线程退出时要做的事情。

需要注意的问题有几点:
1,push与pop一定是成对出现的,其实push中包含"{"而pop中包含"}",少一个不行。
2,push可以有多个,同样的pop也要对应的数量,遵循"先进后出原则"。

push进去的函数可能在以下三个时机执行:
1,显示的调用pthread_exit();

2,在cancel点线程被cancel。

3,pthread_cleanup_pop()的参数不为0时。

以上动作都限定在push/pop涵盖的代码内。

  1 #include
  2 #include
  3 #include
  4 #include
  5
  6 void * thr_fn(void *);
  7 void cleanup(void *);
  8 int main(int argc,char ** argv)
  9 {
 10         pthread_t tid;
 11         int err;
 12         void * tret;
 13
 14         err=pthread_create(&tid,NULL,thr_fn,NULL);
 15         if(err!=0)
 16                 printf("create thread error: %s\n",strerror(err));
 17         err=pthread_join(tid,&tret);
 18         if(err!=0)
 19                 printf("thread join error: %s\n",strerror(err));
 20         printf("thread exit code %d\n",(int)tret);
 21
 22         return 0;
 23 }
 24 void cleanup(void * arg)
 25 {
 26         printf("clean : %s\n",(char *)arg);
 27 }
 28 void * thr_fn(void * arg)
 29 {
 30         printf("thread push start.\n");
 31         pthread_cleanup_push(cleanup,"thread first handler");
 32         pthread_cleanup_push(cleanup,"thread second handler");
 33         printf("thread push over.\n");
 34
 35         pthread_exit((void *)1);
 36
 37         pthread_cleanup_pop(0);
 38         pthread_cleanup_pop(0);
 39         pthread_exit((void *)2);
 40 }

阅读(2278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~