pthread_join returns 一个 NULL 地址

pthread_join returns a NULL address

我是 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 地址。

因为你的函数 returns NULL.

换句话说,它会 return 无论你的函数 returns.

检查这个例子:

#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

The pthread_join() function shall suspend execution of the calling thread until the target thread terminates, unless the target thread has already terminated. On return from a successful pthread_join() call with a non-NULL value_ptr argument, the value passed to pthread_exit() by the terminating thread shall be made available in the location referenced by value_ptr. When a pthread_join() returns successfully, the target thread has been terminated.

我还建议您阅读 this question and check this link,其中实际展示了如何使用此功能。

PS - 我给了你 +1 的余额,但下次请在询问之前更加努力地搜索。 :)

首先,您需要调用pthread_exit():

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

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

The ret status prints as NULL . Why does it print a NULL address.

发生这种情况是因为您的线程函数正在返回 NULL:

    return NULL;

如果你把它改成类似

    return "Hello, multithreaded world!";

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