|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
线程终止:
. M [! C1 T# i, m; h' i2 i1.start_routine回调函数执行return;
- @% H8 p: M" o% }2.线程自身调用pthread_exit();" K, x% O, g3 d' u+ C
3.其他线程调用pthread_cancel(ID)将此进程终止;
! x/ f' P8 C' v6 M2 N. h任意线程调用exit()使整个进程退出。' r: y# Z3 W& l6 |# H# c$ h/ E
+ n9 i7 A, |- r/ ^
线程回收:线程默认joinable状态,终止后需使用pthread_join回收资源;将子线程使用pthread_detach从主线程分离后处于unjoinable状态,系统等线程退出后自动回收资源。- @5 j5 N3 l( {+ L" H
常用的 函数调用如下:
" ?4 _& q* H% y2 D' v4 v$ }pthread_exit():结束本线程) L6 C+ `. R! K2 {1 v$ [- l7 }: ^
#include
6 b$ ]) S5 p! V. V( e3 ^1 evoid pthread_exit(void *retval);" t2 x: Y* p( e8 |3 B: P9 g* u+ E
参数含义:
) X0 e$ G( p9 L8 U& b/ ^retval:线程返回值,其他线程调用pthread_join()接收。
O- a4 G5 G; Q4 I3 b
" x4 M% f- |! i. T6 _+ l: ~pthread_cancel():向指定线程发出取消请求,使用pthread_join回收,
( V6 V+ Y! r$ R3 x0 K#include
6 x+ F) |4 G5 G7 M0 Z% rint pthread_cancel(pthread_t thread);
- E; ]( i7 H9 E+ v参数含义:# D y5 [9 Y5 J' Z7 X5 w3 }1 H$ z
thread:要终止的线程ID;& I% p& u* W. u; k5 M$ s N
返回值:执行成功返回0,成功不一定会让指定线程终止;执行失败返回错误号,& E* v0 \' d* f, ?4 Y# A
* ?* M8 F4 @4 w! z% Upthread_join():等待线程终止回收资源,获取返回值retval,
/ Y! E7 M; N! p: x. F% Y7 ]#include& u9 c" S7 _$ k8 } t! M |) d: w
int pthread_join(pthread_t thread, void **retval);* ^; E8 p* [3 W9 ?: y3 y
参数含义:5 O1 g5 n# j% v) g' \
thread:线程 ID。
# D, j+ A4 q b9 J' Sretval:存放回收线程的返回值。. s3 J4 R6 T+ y# g( X# }. r6 |
返回值:成功返回0,失败返回错误号。. U4 a3 _! A+ B3 A# \ L3 K$ x
: Q! y; y/ V# O! `pthread_detach():分离线程,线程终止后系统自动清理,分离后不能再使用join获取状态, U4 `" }$ P6 }
#include0 t' n V" h% I5 r, J7 p
int pthread_detach(pthread_t thread);6 V# }" j4 O7 F- x1 s4 @# n
参数含义:要分离的线程 ID。
1 `3 h; g5 I- {5 K9 B返回值:成功返回0,失败返回错误号。
^& }8 {' k1 k( Z" q本章代码在thread/目录下,实验1:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。- A. q, j- e$ @' @
使用pthread_cancel让线程退出,pthread_join回收,代码在cancel.c:
/ Q/ e) b+ }' Z" V7 e2 i& _ 7 b* O/ s. `, \# i5 G9 [/ f8 F
编译:gcc cancel.c -o cancel -lpthread,运行结果:6 w1 {* Y" @- f# I
![]()
$ [1 R' {6 q( I& }$ J* I" y使用pthread_exit让线程退出,pthread_join回收线程资源,代码在/thread/exit/目录下,# R/ K/ n9 J6 n5 t! j
线程依次使用pthread_exit退出,然后pthread_join依次回收线程,main.c:
( |6 x( h3 B) z# p$ _9 x b/ A7 O5 p o
编译运行,可以看到线程按顺序依次退出并打印pthread_exit的返回值:
4 w/ ^4 j" b* n, Q1 j2 m, ~, G7 Y7 J9 ]![]()
7 z2 U/ n) a; U# Z6 Y7 S* e1 n, g实验三:% y6 U/ B, g: [$ c& t
使用pthread_detach()设置线程分离,pthread_exit()退出后,系统自动回收,最后调用pthread_join()发现报错,说明线程分离后线程自动释放。
) h$ v+ v0 U0 B7 \: A实验代码在detach.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。5 P; R* O+ w+ r. g2 W
![]()
; V1 t9 e0 L# f![]()
" [' ?1 k) G5 o" T3 z0 {$ f" Y编译,gcc -o detach detach.c -lpthread,运行结果如下,发现使用pthread_join()报错:
. T3 }" j0 v; J* ]. k2 Z* g) J- O![]()
) p; w$ I" f0 N |
|