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() 並回傳 123 數字,接著在 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
32
33
// g++ cpp-pthread_exit.cpp -o a.out -pthread
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

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

int *result = (int *)malloc(sizeof(int));
*result = 123;
pthread_exit(result);
printf("foo 2\n");
return NULL;
}

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

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

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

printf("retval: %d\n", *retval);
free(retval);
return 0;
}

結果輸出如下,

1
2
foo 1
retval: 123

這邊另外介紹在 foo 函式裡用 pthread_exit() 並回傳 hello 字串,接著在 main 主程式中用 pthread_join() 接收到這個回傳值並且印出來,

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
25
26
27
28
29
30
31
32
33
34
// g++ cpp-pthread_exit2.cpp -o a.out -pthread
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

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

char *result = (char *)malloc(32 * sizeof(char));
strcpy(result, "hello");
pthread_exit(result);
printf("foo 2\n");
return NULL;
}

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

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

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

printf("retval: %s\n", retval);
free(retval);
return 0;
}

結果輸出如下,

1
2
foo 1
retval: hello

pthread_exit 其它使用情境

這邊介紹 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
// 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;
}

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

結果輸出如下,

1
2
3
main ++
foo ++
main --

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

cpp-pthread_exit4.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_exit4.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 pthread_detach 用法與範例
C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 sched_setaffinity
C/C++ Linux/Unix pthread 建立多執行緒用法與範例
C++ std::thread 建立多執行緒用法與範例