免费注册 查看新帖 |

Chinaunix

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

问一段 APUE 上关于线程部分的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-19 22:32 |只看该作者 |倒序浏览
本帖最后由 tanggula2007 于 2010-08-19 22:35 编辑

问题是这样的:
按照书上所说(APUE(第2版) 中文版   Page:290 ),为了避免主线程退出,造成新创建的线程未能执行完,整个进程就退出,因此在主线程中使用了  sleep(1) 函数,
这一点我能明白。但是,假如现在我将 sleep(1)注释掉,执行编译出的结果时,会出现三种情况

1.主线程执行完毕,直接退出,新创建的线程未能执行完,只打印出主线程的信息;
2.主线程和新线程都执行完毕,两个线程的信息都打印出来了;
以上两种情况,我都能理解

3.除了打印出第2种情况的信息以外,新创建的线程的信息会再次打印一遍
搞不懂这是为什么?望高人出来指点指点

代码贴出来
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdlib.h>

  6. pthread_t ntid;

  7. void
  8. printids(const char *s)
  9. {
  10.         pid_t                pid;
  11.         pthread_t        tid;

  12.         pid = getpid();
  13.         tid = pthread_self();

  14.         printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
  15. }

  16. void *
  17. thr_fn(void *arg)
  18. {
  19.         printids("new thread: ");
  20.         return((void *)0);
  21. }

  22. int
  23. main(void)
  24. {
  25.         int err;


  26.         err = pthread_create(&ntid, NULL, thr_fn, NULL);
  27.         if(err != 0)
  28.                 printf("can't create thread : %s\n", strerror(err));      //这里没有使用书上的由作者定义的出错函数

  29.         printids("main thread:");
  30. //        sleep(1);            //故意注释了原来的代码
  31.         exit(0);
  32. }
复制代码
gcc编译时需加上  "-lpthread"

论坛徽章:
0
2 [报告]
发表于 2010-08-19 23:53 |只看该作者
好像我运行了很多次都没有子线程运行2次的啊~

论坛徽章:
0
3 [报告]
发表于 2010-08-20 00:24 |只看该作者
是不是printf的问题,这个函数原本是不可重入的,

论坛徽章:
0
4 [报告]
发表于 2010-08-20 01:25 |只看该作者
回复 2# liexusong


    我运行的时候
我描述的三个情况都出现过啊

论坛徽章:
0
5 [报告]
发表于 2010-08-20 08:49 |只看该作者
当我在main()函数里面用pthread_join把子线程合并的时候,一切不确定性就消失了。
出现两次newthread的原因我猜是因为。。。猜不到,某非是默认的线程清理函数在搞鬼?

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
6 [报告]
发表于 2010-08-20 09:39 |只看该作者
本帖最后由 phy0077 于 2010-08-20 09:44 编辑

貌似你无法确定子线程的printf是否执行完了。这个是行缓冲的,如果你保证printf执行完毕,就不应该会出现第三种情况了。
sleep也不是这么用的,不应该做这种假设

论坛徽章:
0
7 [报告]
发表于 2010-08-20 10:41 |只看该作者
回复 6# phy0077


    这不是  拿来做产品的代码   只是APUE上的,我只是好奇为什么会出现第三种情况,
    况且这也不是我的假设,运行的时候的确出现了第三种情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP