QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1198|回复: 9

请教pthread_create的一个问题

[复制链接]
发表于 2005-1-20 16:22:37 | 显示全部楼层 |阅读模式
关于POSIX标准,pthread_create的一个问题

#include<pthread.h>
#include<stdio.h>
void print_message_function( void *ptr );
  
int main()
  {
     pthread_t thread1, thread2;
     char *message1 = "Hello";
     char *message2 = "World";
     
     pthread_create(&thread1, NULL,
                    (void*)&print_message_function, (void*) message1);
     pthread_create(&thread2, NULL,
                    (void*)&print_message_function, (void*) message2);
  
     return 0;
  }
  
  void print_message_function( void *ptr )
  {
     char *message;
     message = (char *) ptr;
     printf("%s ", message);
  }

    对于以上程序中pthread_create的第三个参数改为(void*)print_message_function(将原先的&去掉),其它都不变,程序也能正常通过。
Pthread_create的原型是: int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg);

这应该是函数的指针呀。如何解释这种现象呢? 哪一种更符合规范呢? 理由是什么呢?

请大家指教,谢谢!
发表于 2005-1-20 21:59:40 | 显示全部楼层
其实那个&没起作用吧? 换言之 优先级的问题?
所以说 不用&一样的
(猜测哦 别当真 ^^)
回复

使用道具 举报

发表于 2005-1-20 22:09:06 | 显示全部楼层
嗯,这个问题我也遇到过,像bzero(buf,BUFSIZ);之类的句子和bzero(&buf,BUFSIZ);发现是一样的,最后他都给我zero掉了

我也想知道为什么……
回复

使用道具 举报

发表于 2005-1-21 09:05:59 | 显示全部楼层
前面一种编译能通过,但运行试过了没有?估计会溢出。
后面一种去掉&才是正确的写法。。。
回复

使用道具 举报

发表于 2005-1-21 09:08:52 | 显示全部楼层
[quote:397d767140="SirStoney"]嗯,这个问题我也遇到过,像bzero(buf,BUFSIZ);之类的句子和bzero(&buf,BUFSIZ);发现是一样的,最后他都给我zero掉了

我也想知道为什么……[/quote]

buf是怎么定义的?
回复

使用道具 举报

 楼主| 发表于 2005-1-21 13:54:46 | 显示全部楼层
两种都能正常运行。其实,我个人认为也是去掉&的方法对,我把它看成是函数指针(返回类型是void*)。 但是,第一种方法是一个有名的典型范例,所以我不得不怀疑自己的判断。

渴望知道本质!!!
回复

使用道具 举报

发表于 2005-1-22 17:05:58 | 显示全部楼层
函数指针在C/C++里面是一种比较特殊的指针形式。请看下面例子:
void my_print(int val)
{
     printf("value is %d\n", val);
}

typedef void (*p)(int) func;

func a = my_print;

a(1);
(*a)(1);

a=&my_print;
a(1);
(*a)(1);

都会打印:
the value is 1

无论给函数指针加入一个*取值与否,c语言都会认为从my_print函数入口开始执行。
同样的道理,在pthread_create时候,无论给print_message_function取地址还是不取,都是给pthread_create传递一个函数的调用入口地址而已。
回复

使用道具 举报

发表于 2005-8-11 14:37:05 | 显示全部楼层
arg

    Is the argument passed to start.

arg 可以传多个参数吗?可以的话怎么写?
回复

使用道具 举报

发表于 2005-8-11 15:01:36 | 显示全部楼层
一个结构指针嘛
回复

使用道具 举报

发表于 2005-8-11 15:15:36 | 显示全部楼层
[quote:f267e18367="wsm"]一个结构指针嘛[/quote]
谢谢 wsm 了解了

if((ret=pthread_create(&thread1, NULL, (void*)task1, (void*)&g1)) != 0)

{

perror("can not create thread 1! ");

exit(EXIT_FAILURE);

}

出自 http://www.mwjx.com/bbs/html/18000/16889.html

这里的 &thread1 是什么意思?以前都是看一个参数的,这一下来了三个有点晕
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 13:32 , Processed in 0.045059 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表