C/C++ Linux pthread_join 用法與範例

本篇 ShengYu 介紹 C/C++ Linux/Unix 執行緒 pthread_join() 用法,pthread_join() 是在當前執行緒等待指定的執行緒執行完畢。

pthread_join 基本用法

使用 pthread_join 會在當前執行緒阻塞並等待指定的執行緒執行完畢,如果指定的執行緒已經終止那麼 pthread_join 會立即回傳,指定的執行緒必須是 joinable 的。

pthread_join 對於 pthread 很重要,不呼叫 pthread_join 可能會造成建立的執行緒沒有執行完畢的問題,以下簡單示範如何使用 pthread_join()

cpp-pthread_join.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// g++ cpp-pthread_join.cpp -o a.out -pthread
#include <stdio.h>
#include <pthread.h>

void * foo(void *arg) {
printf("foo\n");

return NULL;
}

int main() {
pthread_t t1;

if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
return 1;
}

if (pthread_join(t1, NULL) != 0) {
fprintf(stderr, "Error: pthread_join\n");
return 1;
}

return 0;
}

pthread_join 取得回傳值

這邊示範用 pthread_join 來取得執行緒的回傳值,在 foo 回傳 123 整數,在 main 主程式裡用 pthread_join 等待執行緒執行結束並將 retval 印出來,

cpp-pthread_join2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-pthread_join2.cpp -o a.out -pthread
#include <stdio.h>
#include <pthread.h>

void * foo(void *arg) {
printf("foo\n");

return (void *)123;
}

int main() {
pthread_t t1;
void *retval;

if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
return 1;
}

if (pthread_join(t1, &retval) != 0) {
fprintf(stderr, "Error: pthread_join\n");
return 1;
}

if (retval != NULL) {
printf("retval: %d\n", retval);
}

return 0;
}

輸出結果如下,

1
2
foo
retval: 123

這邊示範用 pthread_join 來取得執行緒的回傳值,在 foo 回傳 hello 字串,在 main 主程式裡用 pthread_join 等待執行緒執行結束並將 retval 印出來,

cpp-pthread_join3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-pthread_join3.cpp -o a.out -pthread
#include <stdio.h>
#include <pthread.h>

void * foo(void *arg) {
printf("foo\n");

return (void *)"hello";
}

int main() {
pthread_t t1;
void *retval;

if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
return 1;
}

if (pthread_join(t1, &retval) != 0) {
fprintf(stderr, "Error: pthread_join\n");
return 1;
}

if (retval != NULL) {
printf("retval: %s\n", (char *)retval);
}

return 0;
}

輸出結果如下,

1
2
foo
retval: hello

其它參考
pthread_join(3) - Linux manual page
https://man7.org/linux/man-pages/man3/pthread_join.3.html

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ Linux pthread_detach 用法與範例
C/C++ Linux pthread_exit 用法與範例
C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 sched_setaffinity
C/C++ Linux/Unix pthread 建立多執行緒用法與範例
C++ std::thread 建立多執行緒用法與範例