Chinaunix

标题: pthread_exit的问题 [打印本页]

作者: wangxiaoguang    时间: 2008-08-23 08:20
标题: pthread_exit的问题
#include <pthread.h>
int main(void)
{
        int fd;
        int a();
        int b[10];
        pthread_create(&fd,NULL,a,NULL);
        pthread_join(fd,b);
        printf("%s",b);
        return 0;

}
a()
{
        char  a[]="asdf";
        pthread_exit(a);
}
帮我看看这段代码为什么pthread_exit(a) 不能将返回值返回到b数组,打印出的是乱码!
作者: cj_gameboy    时间: 2008-08-23 08:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: bobozhang    时间: 2008-08-23 08:34
改成printf("%s",(char *)b[0]);
作者: wangxiaoguang    时间: 2008-08-23 08:53
标题: 回复 #3 bobozhang 的帖子
还是不行啊
作者: 0vk0    时间: 2008-08-23 08:59
int a();
这个函数怎么调用的
作者: wangxiaoguang    时间: 2008-08-23 09:07
标题: 回复 #5 0vk0 的帖子
这个是函数的声明,应该是char * a();,但改了还是不行啊
作者: bobozhang    时间: 2008-08-23 09:11
那只可能是那个线程的栈被覆盖了,你改成char  *a="asdf";然后再main中printf b[0]试试看
作者: bobozhang    时间: 2008-08-23 09:13
哦,一定是覆盖了,因为从a函数返回后还调用了一些列线程清理相关的函数,只是我们看起来像线程志调用了那个a函数
作者: happy_fish100    时间: 2008-08-23 09:20
标题: 回复 #1 wangxiaoguang 的帖子
函数内的局部变量,函数执行完后,其值就无意义了。
为了测试效果,可以前面加上static,或者动态分配内存。
如:
static char  a[]="asdf";

int b[10];
这样定义不太对吧
试试 char *b;
pthread_join(fd, &b);

以下是你用到的两个pthread函数的声明:
void pthread_exit(void *retval)
int pthread_join(pthread_t th, void **thread_return)
作者: wangxiaoguang    时间: 2008-08-23 09:41
谢谢各位了,改了之后可以了,不过还有几点疑问
1.pthread_join(fd,&b);中第二个参数是一个指针,b本身就是一个指针,为什么要加&?
2int pthread_join(pthread_t th, void **thread_return)函数原型中的第二个参数是一个指向指针的指针,为什么我的代码中写pthread_exit(p);,而不是pthread_exit(&p);


#include <pthread.h>
#include <sys/types.h>
int main(void)
{
        pthread_t  fd;
        char *  a();
        char *  b;
        pthread_create(&fd,NULL,a,NULL);
        pthread_join(fd,&b);

        printf("%s",b);
        return 0;

}
char *  a()
{
        char  *p="asdf";
        pthread_exit(p);
}
作者: happy_fish100    时间: 2008-08-23 10:01
标题: 回复 #10 wangxiaoguang 的帖子
pthread_join中的第二个参数接收pthread_exit返回的参数,所以要使用二重指针。
作者: wangxiaoguang    时间: 2008-08-23 10:03
#include <pthread.h>
#include <sys/types.h>
int main(void)
{
        pthread_t  fd;
        int a();
        int b;
        pthread_create(&fd,NULL,a,NULL);
        pthread_join(fd,&b);

        printf("%d",b);
        return 0;

}
a()
{
        int p=3;
        pthread_exit(p);
}
这段代码也能正常打印出b的值,但pthread_exit和pthread_join的参数并没有按照函数原型写啊?
作者: happy_fish100    时间: 2008-08-23 11:37
标题: 回复 #12 wangxiaoguang 的帖子
编译时带上-Wall,应该会报warning
作者: zjf30366    时间: 2008-08-26 16:48
他们的原型是这样的,这样你就看出区别了吧。

int   pthread_join(pthread_t, void **);

void  pthread_exit(void *);
作者: 熏红猴    时间: 2008-08-26 16:54
它返回的指针,可以指向任何内容。
作者: dv小胖    时间: 2011-10-12 16:04
如果申明的是char a[]数组,则在a函数执行结束之后,a函数的内存会被释放,a数组的空间会被破坏,就是这个道理啊。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2