免费注册 查看新帖 |

Chinaunix

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

线程问题 pthread [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-25 10:50 |只看该作者 |倒序浏览
  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <pthread.h>;
  4. #include <time.h>;
  5. #include <string.h>;
  6. #include <sys/stat.h>;
  7. #include <sys/types.h>;
  8. #include <errno.h>;

  9. #define BUFFER 512
  10. #define MAX_HOST        256       

  11. struct rcmd_type{
  12.         char *hostname;
  13.         char *time;
  14. };


  15. void *_exec_program(void *arg) {
  16.         int ret;
  17.         char *buff;
  18.         struct rcmd_type *host = (struct rcmd_type *)arg;
  19.         printf("GET HOSTNAME: %s TIME: %s \n",host->;hostname,host->;time);
  20.                  ret =1;
  21.         pthread_exit(&ret);
  22. }


  23. int main(int argc,char **argv)
  24. {
  25.         pthread_t *thread;
  26.         char *hostname[MAX_HOST];
  27.         int i,j,host_num;
  28.         int ret;
  29.         struct rcmd_type host;
  30.        
  31.         host_num = get_host((char **)(&hostname));
  32.         if(argc!=2)
  33.                 return 0;
  34.        
  35.         if(host_num<0)
  36.                 return 0;
  37.                        
  38.         if((thread=(pthread_t *)malloc(sizeof(pthread_t)*host_num))==NULL){
  39.                 fprintf(stderr,"Out Of Memory!\n\a");
  40.                 exit(1);
  41.         }
  42.         host.time = argv[1];
  43.         for(i=0,j=0;i<=host_num;i++,j++){
  44.                 host.hostname = NULL;
  45.                 host.hostname = hostname[i];
  46.                 if(pthread_create(&thread[j],NULL,_exec_program,(void *)&host)!=0)
  47.                          fprintf(stderr,"Create Thread[%d] Error:%s\n\a",i,strerror(errno));
  48.         }
  49.        
  50.         ret = 0;
  51.         for(i=0;i<=host_num;i++){
  52.                 if(pthread_join(thread[i],(void *)&ret)!=0)
  53.                          fprintf(stderr,"Thread[%d] Join Error:%s\n\a",i,strerror(errno));
  54.                 else {
  55.                            if(ret==0)
  56.                                    continue;
  57.                            printf("Thread[%d] Exit\n\a",i);
  58.                            free(hostname[i]);
  59.                           
  60.                 }
  61.         }
  62.         free(thread);
  63.         exit(0);
  64. }



复制代码

请斑竹帮我看看,怎么每次线程得到的参数有问题,或老是一样的或不全!
get_host 程序主要作用是创建服务器的数组,然后返回服务器数目

论坛徽章:
0
2 [报告]
发表于 2004-05-25 11:15 |只看该作者

线程问题 pthread

1.你要在get_host函数之后检查host_num和hostname的内容。

2.如果host_num大于1,那么前一个线程的参数被后一个线程覆盖是一定的,因为他们的参数都是host这个变量的地址。

3.那个for里面为什么要用i和j两个变量,一个就可以了啊

论坛徽章:
0
3 [报告]
发表于 2004-05-25 11:29 |只看该作者

线程问题 pthread

你的代码,出错是必然的。

线程是在同一个地址空间里运行的。多个线程共享同一个进程的资源,包括全局变量等。

考虑这种情况:
主线程pthread_create了一个子线程,准备从host变量中取数据,在尚未取之时,主线程获得执行权,而主线程此时处在循环体中,修改了host数据。当子进程再次获得CPU时,host变量已经物是人非了。

这就是最典型的竞态条件,可以通过添加互斥量等来同步(code略)
或者将host改为
struct rcmd_type host[MAX_HOST]

   for(i=0;i<=host_num;i++,j++){
      host.time = argv[1];
      host.hostname = NULL;
      host.hostname = hostname;
      if(pthread_create(&thread,NULL,_exec_program,(void *)&host)!=0)
          fprintf(stderr,"Create Thread[%d] Error:%s\n\a",i,strerror(errno));
  }

论坛徽章:
0
4 [报告]
发表于 2004-05-25 12:14 |只看该作者

线程问题 pthread

为什么不用host数组就不行呢
我在传送参数是已经给他赋值了,
只是用了一个变量指针,为什么不行了呢

论坛徽章:
0
5 [报告]
发表于 2004-05-25 12:17 |只看该作者

线程问题 pthread

因为OS调度的缘故,主线程有可能在你的子线程去hostname变量的值之前已经修改了该变量,甚至你取到的有可能是该了一半的值。

建议看看关于线程同步的理论。

论坛徽章:
0
6 [报告]
发表于 2004-09-01 12:21 |只看该作者

线程问题 pthread

我也遇到这个问题,可是,能不能不用数组实现host的传递呢,因为我的线程数量是未知的,应该有一种方法给线程传递参数吧。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP