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

本篇 ShengYu 介紹 C/C++ Linux/Unix 執行緒 pthread_exit() 用法,pthread_exit() 是用來結束該執行緒並頭透過 pthread_exit 的 retval 參數來回傳值,該回傳值可被 pthread_join 取得到。

pthread_exit 基本用法

以下簡單示範如何使用 pthread_exit(),在 foo 函式裡用 pthread_exit() 並回傳 hello 字串,接著在 main 主程式中用 pthread_join() 接收到這個回傳值並且印出來,

cpp-pthread_exit.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
31
// g++ cpp-pthread_exit.cpp -o a.out -pthread
#include <stdio.h>
#include <pthread.h>

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

pthread_exit((void *)"hello");
return NULL;
}

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", retval);
}

return 0;
}

pthread_exit 使用情境

另一個使用情境,有時 main 主程式已經執行完畢並結束,那麼建立出來的執行緒就終止了,如下範例,

cpp-pthread_exit2.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
// g++ cpp-pthread_exit2.cpp -o a.out -pthread
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void * foo(void *arg) {
printf("foo ++\n");
sleep(3);
printf("foo --\n");
return NULL;
}

int main() {
printf("main ++\n");
pthread_t t1;

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

printf("main --\n");
return 0;
}

結果輸出如下,

1
2
main ++
main --

如果要讓建立出來的執行緒不被 main 主程式的結束退出影響的話可以在主程式結束時呼叫 pthread_exit(),會等到所以所有執行緒結束後 main 才會退出,如下範例,

cpp-pthread_exit3.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
// g++ cpp-pthread_exit3.cpp -o a.out -pthread
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void * foo(void *arg) {
printf("foo ++\n");
sleep(3);
printf("foo --\n");
return NULL;
}

int main() {
printf("main ++\n");
pthread_t t1;

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

printf("pthread_exit\n");
pthread_exit(NULL);
printf("main --\n");
return 0;
}

而使用 pthread_exit 自然不會執行到後面的 printf("main --\n");return 0,輸出結果如下,

1
2
3
4
main ++
pthread_exit
foo ++
foo --

以上就是 C/C++ Linux pthread_exit 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
pthread_exit(3) - Linux manual page
https://man7.org/linux/man-pages/man3/pthread_exit.3.html
pthread_exit()函數:終止線程
http://c.biancheng.net/view/8608.html

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