本篇 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()
接收到這個回傳值並且印出來,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
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
2foo 1
retval: 123
這邊另外介紹在 foo 函式裡用 pthread_exit()
並回傳 hello
字串,接著在 main 主程式中用 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
26
27
28
29
30
31
32
33
34// g++ cpp-pthread_exit2.cpp -o a.out -pthread
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
2foo 1
retval: hello
pthread_exit 其它使用情境
這邊介紹 pthread_exit 另一個使用情境,有時 main 主程式已經執行完畢並結束,那麼建立出來的執行緒就終止了,如下範例,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
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
3main ++
foo ++
main --
如果要讓建立出來的執行緒不被 main 主程式的結束退出影響時,就需要在主程式結束時呼叫 pthread_exit()
,這樣會等到所有執行緒結束後 main 才會退出,如下範例,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
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
4main ++
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 建立多執行緒用法與範例