pthread_join返回NULL地址

时间:2015-01-25 13:12:26

标签: c pthreads

我是C语言编程的新手。我在下面尝试了一个简单的程序。

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

void* func(void* arg){
        sleep(1);
        printf("\n tid : %u \n",(unsigned int)pthread_self());
        return NULL;
}

int main(){
        pthread_t tid;
        void* ret;
        pthread_create(&tid,NULL,&func,NULL);
        pthread_join(tid,&ret);
        printf("\n ret status : %s \n",(char *)ret);
        return 0;
}

ret状态打印为NULL。为什么打印NULL地址。

3 个答案:

答案 0 :(得分:2)

因为您的函数返回NULL

换句话说,它将返回函数返回的任何内容。

检查此示例:

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

void* func(void* arg){
        sleep(1);
        printf("\n tid : %u \n",(unsigned int)pthread_self());
        return "I am done"; // I changed the return line
}

int main(){
        pthread_t tid;
        void* ret;
        pthread_create(&tid,NULL,&func,NULL);
        pthread_join(tid,&ret);
        printf("\n ret status : %s \n",(char *)ret);
        return 0;
}

输出:

samaras@samaras-A15:~$ ./px

 tid : 3075947328 

 ret status : I am done <-- and not NULL

您应该阅读manual

  

pthread_join()函数应暂停执行调用线程,直到目标线程终止,除非目标线程已经终止。从具有非NULL value_ptr参数的成功pthread_join()调用返回时,终止线程传递给pthread_exit()的值应在value_ptr引用的位置可用。当pthread_join()成功返回时,目标线程已被终止。

我还建议您阅读this问题并查看this链接,该链接实际上说明了如何使用此功能。

PS - 我给了你一个+1的余额,但下次请求之前请更加努力。 :)

答案 1 :(得分:2)

  

ret状态打印为NULL。为什么打印NULL地址。

这是因为您的线程函数正在返回NULL

    return NULL;

如果您将其更改为

    return "Hello, multithreaded world!";

你会看到主线程打印出来的字符串。

答案 2 :(得分:-1)

首先,您需要致电pthread_exit()

void* func(void* arg){
        sleep(1);
        printf("\n tid : %u \n",(unsigned int)pthread_self());
        pthread_exit(NULL);
}

此外,如果您返回NULL,那么这就是返回值。