免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2382 | 回复: 4
打印 上一主题 下一主题

关于线程清理处理程序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-20 15:49 |只看该作者 |倒序浏览
1可用积分
APUE2中关于线程清理处理函数时说明:如果线程是从启动例程返回的而终止的话(也就是调用return而不是pthread_exit),则线程的清理处理程序则不会被调用。
以下是一个测试的函数,但是结果却是两个线程都调用了线程清理处理函数,为什么呢?
难道线程1不是启动例程返回的吗?顺便说说什么才是从启动例程返回吧?

  1. #include <stdio.h>
  2. #include <pthread.h>

  3. static void cleanup(void* arg){
  4.         printf("cleanup: %s\n", arg);
  5. }

  6. static void* thr_fn1(void* arg){//从启动例程返回
  7.         printf("thread 1:\n");
  8.         pthread_cleanup_push(cleanup, "thread 1 first handler\n");
  9.         pthread_cleanup_push(cleanup, "thread 1 second handler\n");
  10.         printf("thread 1 push complete\n");

  11.         if(arg){
  12.                 printf("hhhhhhhhhhhhhhhhhhhhhhhh\n");
  13.                 return ((void*)1);
  14.         }

  15.         pthread_cleanup_pop(1);
  16.         pthread_cleanup_pop(1);
  17.         return ((void*)1);
  18. }

  19. static void* thr_fn2(void* arg){//用pthread_exit()返回
  20.         printf("%s\n", (char*)arg);
  21.         pthread_cleanup_push(cleanup, "thread 2 first handler\n");
  22.         pthread_cleanup_push(cleanup, "thread 2 second handler\n");
  23.         printf("thread 2 push complete\n");

  24.         if(arg){
  25.                 printf("tttttttttttttttttttttt\n");
  26.                 pthread_exit((void*)2);
  27.         }

  28.         pthread_cleanup_pop(1);
  29.         pthread_cleanup_pop(1);
  30.         pthread_exit((void*)2);
  31. }

  32. int main(void)
  33. {
  34.         int                     err;
  35.         pthread_t               tid1, tid2;
  36.         void*                   rval;

  37.         err = pthread_create(&tid1, NULL, thr_fn1, NULL);
  38.         if(err != 0){
  39.                 perror("pthread_create");
  40.                 return 1;
  41.         }

  42.         err = pthread_create(&tid2, NULL, thr_fn2, "thread 2:");
  43.         if(err != 0){
  44.                 perror("pthread_create");
  45.                 return 2;
  46.         }

  47.         err = pthread_join(tid1, (void*)&rval);
  48.         if(err != 0){
  49.                 perror("pthread_join");
  50.                 return 3;
  51.         }
  52.         printf("thread 1 exiting code %d\n", (int)rval);

  53.         err = pthread_join(tid2, (void*)&rval);
  54.         if(err != 0){
  55.                 perror("pthread_join");
  56.                 return 4;
  57.         }
  58.         printf("thread 2 exiting code %d\n", (int)rval);

  59.         return 0;
  60. }
复制代码


运行结果是:
thread 1:
thread 1 push complete
cleanup: thread 1 second handler

cleanup: thread 1 first handler

thread 2
thread 2 push complete
tttttttttttttttttttttt
cleanup: thread 2 second handler

cleanup: thread 2 first handler

thread 1 exiting code 1
thread 2 exiting code 2

还有一点不明白的是:程序输出cleanup之间的换行是从哪里得到的?

chiefboy 该用户已被删除
2 [报告]
发表于 2007-10-20 18:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2007-10-20 18:59 |只看该作者

回复 #2 chiefboy 的帖子

就是说在:wink: 执行清理函数cleanup传参的 时候,自动在"thread 1 first handler\n"后面加了一个换行符了,这样就是换行了两次了

论坛徽章:
0
4 [报告]
发表于 2007-10-21 14:45 |只看该作者
难道fedora7环境下线程从启动例程下返回,线程的清理函数也会被调用?但是APUE2上说不会被调用啊?难道是因为linux版本的问题?

论坛徽章:
0
5 [报告]
发表于 2007-10-23 01:27 |只看该作者
是不是这个问题太简单了!:em11: :em11: :em11: :em11:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP