Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418701
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1393
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 12:17
个人简介

www.vibexie.com vibexie@qq.com

文章分类

全部博文(121)

文章存档

2015年(55)

2014年(66)

我的朋友

分类: C/C++

2014-10-14 14:59:43

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涵盖的代码内。

前面的2个比较好理解,关键是pthread_cleanup_pop参数问题,其实int那是因为c没有bool,这里的参数只有0与非0的区别,对pthread_cleanup_pop,参数是5和10都是一样的,都是非0。对于pthread_cleanup_pop()问题,我写了以下代码讲解

点击(此处)折叠或打开

  1. #include"apue.h"
  2. #include<pthread.h>

  3. pthread_t ntid;

  4. void printids(const char *s)
  5. {
  6.     pid_t pid;
  7.     pthread_t tid;

  8.     pid=getpid();
  9.     tid=pthread_self();
  10.     printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,(unsigned int)tid,(unsigned int)tid);
  11. }

  12. void cleanup(void *arg)
  13. {
  14.     printf("cleanup:%s\n",(char*)arg);
  15. }

  16. void *thr_fn_1(void *arg)
  17. {
  18.     pthread_cleanup_push(cleanup,"thread handler 1");
  19.     pthread_cleanup_push(cleanup,"thread handler 2");
  20.     printids("new thread: ");
  21.     if(arg)
  22.         pthread_exit((void*)1);
  23.     pthread_cleanup_pop(0);
  24.     pthread_cleanup_pop(0);
  25.     pthread_exit((void*)1);
  26. }

  27. int main()
  28. {
  29.     int err;
  30.     void *tret;
  31.     err=pthread_create(&ntid,NULL,thr_fn_1,(void*)1);
  32.     if(err!=0)
  33.         printf("can't create thread\n");
  34.     printids("main thread:");
  35.     pthread_join(ntid,&tret);
  36.     return 0;
  37. }


if(arg)
        pthread_exit((void*)1);
这一句是一个关键点,即如果arg非0,则执行pthread_exit((void*)1);于是就依次调用了push的函数,而后面的两句pthread_cleanup_pop(0);
仅仅是为了补齐pthread_cleanup_push(),pthread_cleanup_push()与pthread_cleanup_pop()是一一配对的,如果不配对的话就不能编译通过。

运行结果为:
        main thread: pid 3575 tid 356333376 (0x153d3740)
        new thread:  pid 3575 tid 348067584 (0x14bf1700)
        cleanup:thread handler 2
        cleanup:thread handler 1
    


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