免费注册 查看新帖 |

Chinaunix

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

linux2.6多线程问题 [复制链接]

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-04 16:08 |只看该作者 |倒序浏览
菜鸟勿拍哈,pthread_cleanup_push函数,当pthread_clean_pop的参数execute为非零时,线程应该执行清理函数,这个对吧?
我的代码如下:
  1. #include <pthread.h>
  2. #include "apue.h"

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

  8. void *
  9. thr_fn1(void *arg)
  10. {
  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. int
  22. main(void)
  23. {
  24.         int err;
  25.         pthread_t tid1;
  26.         void *tret;

  27.         err = pthread_create(&tid1, NULL, thr_fn1, (void *)1);
  28.         if(err != 0)
  29.           err_quit("can't create thread 1 : %s\n", strerror(err));


  30.         err = pthread_join(tid1, &tret);
  31.         if(err != 0)
  32.           err_quit("can't join with thread 1 : %s\n", strerror(err));
  33.         printf("thread 1 exit code %d\n", (int)tret);

  34.         exit(0);
  35. }
复制代码
但是运行结果依然没有调用清理函数,怎么回事阿?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2012-03-04 17:12 |只看该作者
push注册的函数会执行,只有当线程有以下动作时:
1. 调用pthread_exit;
2. 响应线程取消请求;
3. 调用非零execute的pop

“当pthread_clean_pop的参数execute为非零时,线程应该执行清理函数,这个对吧?”
没错,但你的代码在pop之前都return了,所以不符合上述任何情况

更重要的是POSIX规定在push与pop的语义块范围内,禁止调用return或break或continue或goto跳出!否则后果自负

论坛徽章:
1
亥猪
日期:2013-10-30 23:29:55
3 [报告]
发表于 2012-03-04 19:33 |只看该作者
回复 2# timespace


    如果我在return之前pop(execute),execute为非零数,这样没问题吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP