当前位置:  技术问答>linux和unix

多线程ping程序中main线程停止执行,求大牛哥相助!

    来源: 互联网  发布时间:2017-05-24

    本文导语:  本程序主要实现同时测量到多个ip地址的延时值,用多线程实现。以下显示代码是程序的核心部分,但运行有问题,求高手相助! //initial 初始化  //send 发包  //recv 收包 //proc 处理包,即取包中的数据,计算延时并...

本程序主要实现同时测量到多个ip地址的延时值,用多线程实现。以下显示代码是程序的核心部分,但运行有问题,求高手相助!
//initial 初始化 
//send 发包 
//recv 收包
//proc 处理包,即取包中的数据,计算延时并显示
void *initialsendrecvproc( struct addrinfo *ai )
     {//为方便找出问题,本函数进行了简化,去掉了循环
      //只发一个ping包,然后接收该ping包的返回包
      //最后计算这两个包的时间差,并输出该时间差值
      //具体initial、send、recv、proc代码以下省略 
        …………  
        pthread_exit(NULL);
     }

int main(int argc, char **argv)
{
 int i;
 struct addrinfo *ai;
 char *h;

//ipaddress是一个纯文本文件,为方便找问题,文件里只包含两行字符串
//第一行是”www.google.com”  第二行是”www.kame.net”
 if ((fp1 = fopen("ipaddress","r")) == NULL)
      {
           printf("cannot open infilen");
           exit(0);
      }
 
 while(!feof(fp1))
 {
           fscanf(fp1,"%s",host);    //host的定义语句为 char host[100]
           ai = Host_serv(host, NULL, 0, 0);

 h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);
 printf("PING %s (%s): %d data bytesn", ai->ai_canonname ? ai->ai_canonname : h, h, datalen);

 memset(&thread, 0, sizeof(thread));
 if (( pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)) != 0)
      {
           printf("thread %d create fail!n", i++);
      }
 else
      {
           printf("thread %d create success!n", i++);
      }
 sleep(1);
}
}
程序想达到的效果是启两个线程,分别测试到www.google.com和www.kame.net 的延时,但以上程序执行的结果如下:
[ root@ipv6measure hj]# gcc dxcpingipv6.c –o dxcpingipv6 –lpthread –lunp –g
[ root@ipv6measure hj]# chmod u+s dxcpingipv6
[ root@ipv6measure hj]# ./dxcpingipv6
PING www.google.com (2404:6800:4005:801::1013): 56 data bytes
64 bytes from 2404:6800:4005:801::1013: seq=0, hlim=49, rtt=287.707 ms
[ root@ipv6measure hj]#
也就是说第一个线程启动成功了。但第一个线程执行完了以后,整个程序就结束了,Main线程不再继续往下执行了(按道理第一个线程创建成功后,main线程应执行else后面的语句,显示“thread 0 create success!”才对)。难道问题出在
pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)这一行?我百思不得其解,求大牛哥帮忙!

|
pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)

应该是pthread_create(&thread, NULL, initialsendrecvproc, ai)吧。

你这样等于在主线程里调用了initialsendrecvproc,由于函数调用了pthread_exit造成主线程退出。

|
sleep(1);  改为 sleep(100); 呢 

另外,发代码时使用代码格式

|
sleep(1);  
1000=1s

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java中多线程相关类Thread介绍
  • 一个进程创建了两个线程,如何使得当任何一个线程(比如线程a)结束时,同时也结束线程b,也就是使两个线程一起死掉,怎么办呢?
  • 操作系统 iis7站长之家
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 关于线程的问题,什么样的线程不是active线程?
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • 请问,在一个进程中创建多线程时如何能避免不同的线程获得同一个线程标识
  • 我的一个多线程服务里, 总是有一个线程莫名其妙的变成僵尸线程。
  • 能否通过线程id控制线程的状态?或是观察到线程的状态?
  • 如何在一个线程中启动另外一个线程,然后本线程就退出?
  • 我要设置一个线程的优先级, 这个属性结构并没有线程的id,它怎么知道是设置哪个线程呢?
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • gcc链接的库,分不分单线程版本的和多线程版本的?
  • 内核栈~ 内核线程 ~用户线程 之间关系 问题
  • 子线程的数据如何返回给主线程?
  • 如果父线程死掉 那么子线程会不会死掉呢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3