关于 c:pthread_join 返回一个 NULL 地址

pthread_join returns a NULL address

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<pthread.h>

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

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

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


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

这是因为你的线程函数返回 NULL:

1
    return NULL;

如果你把它改成类似

1
    return"Hello, multithreaded world!";

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


因为你的函数返回 NULL.

换句话说,无论你的函数返回什么,它都会返回。

检查这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<pthread.h>

void* func(void* arg){
        sleep(1);
        printf("\
tid : %u \
"
,(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("\
ret status : %s \
"
,(char *)ret);
        return 0;
}

输出:

1
2
3
4
5
samaras@samaras-A15:~$ ./px

 tid : 3075947328

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

您应该阅读手册。

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.

我还建议你阅读这个问题并检查这个链接,它实际上展示了你如何使用这个功能。

PS - 我给你一个 1 以表示平衡,但下次请在询问之前更加努力地搜索。 :)


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

1
2
3
4
5
6
7
void* func(void* arg){
        sleep(1);
        printf("\
tid : %u \
"
,(unsigned int)pthread_self());
        pthread_exit(NULL);
}

另外,如果你返回NULL,那么这就是返回值。