免费注册 查看新帖 |

Chinaunix

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

多线程程序,每次执行的结果不同? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-31 12:15 |只看该作者 |倒序浏览
程序代码:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>


void *myThread( void *arg )
{
  printf("Thread ran!\n");

  /* Terminate the thread */
  pthread_exit( NULL );
}

int main()
{
  int ret;
  pthread_t mythread;

  ret = pthread_create( &mythread, NULL, myThread, NULL );

  if (ret != 0) {
     printf( "Can’t create pthread (%s)\n", strerror( errno ) );
     exit(-1);
  }

  printf("Parent run!\n");

  return 0;
}


执行结果:
spg-195:~/test/thread # ./ptcreate
Parent run!
spg-195:~/test/thread # ./ptcreate
Parent run!
Thread ran!
spg-195:~/test/thread # ./ptcreate
Parent run!
Thread ran!
Thread ran!  ——为什么这里出现了两个线程函数的打印?
spg-195:~/test/thread # ./ptcreate
Parent run!
Thread ran!
Thread ran!

论坛徽章:
0
2 [报告]
发表于 2012-02-02 09:58 |只看该作者
把进程号打出来看。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2012-02-02 16:35 |只看该作者
线程调度顺序由系统决定了,对用户程序说就是随机,所以你的标准输出会变化。
如果要指定顺序,需要互斥锁和条件变量。
至于两次“Thread ran!”输出,有可能是两个程序交叉输出,如2楼所言,print进程号调试吧。

论坛徽章:
0
4 [报告]
发表于 2012-02-02 20:19 |只看该作者
稍微修改了一下程序,打印线程号:
  1. void *myThread( void *arg )
  2. {
  3.   pthread_t pt;

  4.   pt = pthread_self();

  5.   printf("Thread %x ran!\n", (int)pt );

  6.   pthread_exit( NULL );
  7. }
复制代码
之后每次的打印就变成如下了,看结果好像是线程的打印输出到终端了两次?为啥呢spg-195:~/test/thread # ./ptcreate
Parent run!
Thread b25ec710 ran!
b25ec710 ran!
spg-195:~/test/thread # ./ptcreate
Parent run!
Thread c944b710 ran!
c944b710 ran!
spg-195:~/test/thread # ./ptcreate
Parent run!
Thread 595fc710 ran!
595fc710 ran!

论坛徽章:
0
5 [报告]
发表于 2012-02-02 23:29 |只看该作者
回复 1# lnfxcf


    我觉得你这个在主函数里应该有一个pthread_join来等待线程结束吧,不然可能线程未运行,主函数就结束了吧。

论坛徽章:
0
6 [报告]
发表于 2012-02-02 23:39 |只看该作者
在printf("Parent run!\n");之前加上pthread_join(mythread, NULL);
至少在我的机器上运行就出现
thread run
parent run了。
我新手~错了别怪我~

论坛徽章:
0
7 [报告]
发表于 2012-02-03 10:00 |只看该作者
回复 6# genivs007


    恩,结果正确,谢谢先。
这种现象是否就是父进程提前退出,导致了线程终端等输出异常?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP