本篇 ShengYu 介紹 C/C++ Linux/Unix 執行緒 pthread_join()
用法,pthread_join()
是在當前執行緒等待指定的執行緒執行完畢。
pthread_join 基本用法
使用 pthread_join 會在當前執行緒阻塞並等待指定的執行緒執行完畢,如果指定的執行緒已經終止那麼 pthread_join 會立即回傳,指定的執行緒必須是 joinable 的。
pthread_join 對於 pthread 很重要,不呼叫 pthread_join 可能會造成建立的執行緒沒有執行完畢的問題,以下簡單示範如何使用 pthread_join()
,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
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 印出來,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
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
2foo
retval: 123
這邊示範用 pthread_join 來取得執行緒的回傳值,在 foo 回傳 hello 字串,在 main 主程式裡用 pthread_join 等待執行緒執行結束並將 retval 印出來,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
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
2foo
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 建立多執行緒用法與範例