pthread_cleanup_push/pop函数使用方法

2302阅读 0评论2012-08-03 Helianthus_lu
分类:

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 }

上一篇:Linux内核中进程上下文和中断上下文
下一篇:linux 下基于socket 的B/S 架构web 服务器的构建