当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]ubuntu+c 多线程编程中一个关于花括号的奇怪问题......
帖子发表于 : 2008-08-17 6:34 
头像

注册: 2008-08-10 2:32
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
代码:
#ifdef __Linux__
#define _REENTRANT
#define _POSIX_SOURCE
#endif

#ifdef __Linux__
#define _P __P
#endif

#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define NTHREADS 4
#define errexit(code,str) fprintf(stderr,"%s:%s\n",(str),strerror(code));exit(1);

void *hola(void *arg)
{
   int myid=*(int *)arg;
   printf("Hello,world,I'm%d\n",myid);
   return arg;
}

int main(int argc,char *argv[])
{
   int worker;
   int ids[NTHREADS];
   int errcode;
   int *status;
   pthread_t threads[NTHREADS];

   for(worker=0;worker<NTHREADS;worker++)
   {
      ids[worker]=worker;

      /*
      *如果去掉下面的花括号,程序就不能正常运行
      */      
      if(errcode=pthread_create(&threads[worker],NULL,hola,&threads[worker]))
      {
         errexit(errcode,"pthread create");
      }
   }
   for(worker=0;worker<NTHREADS;worker++)
   {

      /*
      *同样奇怪的是,不去掉下面的花括号会在程序最后显示:thread (null) terminated abnormally
      */
      if(errcode=pthread_join(threads[worker],(void *)&status))
      {
         errexit(errcode,"pthread join");
      }

      if(*status!=worker)
      {
         fprintf(stderr,"thread %s terminated abnormally\n",worker);
         exit(1);
      }
   }
   return 0;
}




去掉pthread_create的花括号(不管pthread_join加不加花括号):
kahn@kahn-PC:~/c$ ./pthread_hellow
kahn@kahn-PC:~/c$

只去掉pthread_join的花括号:
kahn@kahn-PC:~/c$ ./pthread_hellow
Hello,world,I'm-1210295408
Hello,world,I'm-1218688112
Hello,world,I'm-1227080816
kahn@kahn-PC:~/c$ ./pthread_hellow
Hello,world,I'm-1210168432
kahn@kahn-PC:~/c$

不去掉pthread_join的花括号:
kahn@kahn-PC:~/c$ ./pthread_hellow
Hello,world,I'm-1210029168
thread (null) terminated abnormally
kahn@kahn-PC:~/c$ ./pthread_hellow
Hello,world,I'm-1209943152
Hello,world,I'm-1218335856
Hello,world,I'm-1226728560
thread (null) terminated abnormally
kahn@kahn-PC:~/c$

只有一句语句的话,if加不加花括号都是一样的啊,但为什么……:shock: :shock:
是pthread_*这类的函数返回有什么不同还是什么吗?
谁能帮忙解释一下,谢谢了。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-19 4:18 
头像

注册: 2008-08-10 2:32
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
顶一下······


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-22 3:13 

注册: 2007-09-07 3:08
帖子: 38
送出感谢: 0 次
接收感谢: 0 次
代码:
 
      #define errexit(code,str) fprintf(stderr,"%s:%s\n",(str),strerror(code));exit(1);
      if(errcode=pthread_create(&threads[worker],NULL,hola,&threads[worker]))
      {
         errexit(errcode,"pthread create");
      }


宏会被替换为:

代码:

     if(errcode=pthread_create(&threads[worker],NULL,hola,&threads[worker]))
     {
        fprintf(stderr,"%s:%s\n",(str),strerror(code));
        exit(1);
     }


没加花括号就是:
代码:
     if(errcode=pthread_create(&threads[worker],NULL,hola,&threads[worker]))
        fprintf(stderr,"%s:%s\n",(str),strerror(code));
    exit(1); //总是被执行!


我也因为这个问题郁闷了一段时间,后来才发现的。
应当这样写:
代码:
#define errexit(code,str) {fprintf(stderr,"%s:%s\n",(str),strerror(code));exit(1); }


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-30 12:21 
头像

注册: 2008-08-10 2:32
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
哦````````明白了```谢谢``` :D


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译