|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
线程终止:. J- n' M" X0 m' t) ^: r
1.start_routine回调函数执行return;
9 P x$ \+ q" h7 C' h2.线程自身调用pthread_exit();
$ |$ u; C+ c! s z0 q) H3.其他线程调用pthread_cancel(ID)将此进程终止;2 p$ c- C. t/ t0 o! u) y; v
任意线程调用exit()使整个进程退出。" B* K6 \# c; c6 r2 }( X p
6 n1 K; ~# D" R9 ?! d% g7 w线程回收:线程默认joinable状态,终止后需使用pthread_join回收资源;将子线程使用pthread_detach从主线程分离后处于unjoinable状态,系统等线程退出后自动回收资源。
$ J0 Y5 `0 ~: g2 V7 M; ^- B常用的 函数调用如下:) }5 I5 Y4 m& X) p7 E7 u
pthread_exit():结束本线程# B* {) g, O/ T+ |0 K" a% _8 E
#include3 Q3 g q. { Q6 n$ Z/ J5 ^1 S* F4 Y
void pthread_exit(void *retval);* U8 a S" S4 u& x
参数含义:
4 e. z8 J1 |+ R- Wretval:线程返回值,其他线程调用pthread_join()接收。! m/ o" e: _) g
5 @* G/ V3 N! Z. B& h, D( s! u3 X& R7 Q
pthread_cancel():向指定线程发出取消请求,使用pthread_join回收,
4 f1 S3 Y3 `+ r0 U9 k" u$ \+ A#include
1 z& }( r% E: m& c1 `8 w) L Aint pthread_cancel(pthread_t thread);
: a: @1 y: {$ J N, t2 ]1 J参数含义:5 c2 l- Y3 ?( b! g) f2 P1 H+ n
thread:要终止的线程ID;4 `$ v! @3 z6 K- @( q4 i$ f8 M
返回值:执行成功返回0,成功不一定会让指定线程终止;执行失败返回错误号,
( a @ Y( w9 q: O+ W$ Z; \, O; Y" R' }, l2 G0 z- d0 @
pthread_join():等待线程终止回收资源,获取返回值retval,
! Q& w6 [ Z* P#include
9 j$ N( A' M) t! r u6 b# A3 |int pthread_join(pthread_t thread, void **retval);
& o: _, i& P3 l3 H4 ~- H参数含义:
, N3 ~: P: l. l) \thread:线程 ID。/ B' W- @, X3 Y |1 n) w$ |( F1 x
retval:存放回收线程的返回值。
2 |0 M& @7 A' m# d+ X返回值:成功返回0,失败返回错误号。0 S' \" |# W+ E( M
+ E8 y. ^! a$ G P
pthread_detach():分离线程,线程终止后系统自动清理,分离后不能再使用join获取状态,
, S. u! B. G$ v#include
0 ?9 h; d j- m3 R5 o9 O' Nint pthread_detach(pthread_t thread);
: A1 ~8 p3 B8 t! h* {参数含义:要分离的线程 ID。
5 Q: h; l$ j# t1 s5 ~4 P- V返回值:成功返回0,失败返回错误号。
7 L V7 U7 }/ J0 @6 c% l本章代码在thread/目录下,实验1:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。# E( n+ U* _9 S) l9 V0 x) y
使用pthread_cancel让线程退出,pthread_join回收,代码在cancel.c:' [& ~: {3 }6 a( Q
' L) \4 B5 g3 @
编译:gcc cancel.c -o cancel -lpthread,运行结果:" S8 |/ Z9 r B) j
( j. a7 E8 p7 G) u8 @* d# C
使用pthread_exit让线程退出,pthread_join回收线程资源,代码在/thread/exit/目录下,
6 X3 o& n* z9 m T6 Q) Q+ Y2 k" i& C线程依次使用pthread_exit退出,然后pthread_join依次回收线程,main.c:
4 x4 G9 G, E- ?$ D0 E: \ z7 [7 ~* v" u9 E' X6 P) \; [0 O
编译运行,可以看到线程按顺序依次退出并打印pthread_exit的返回值:
% Y* s3 _$ b' F5 \* ] $ z" E! e, Y0 m$ G ]. [1 w# v" Z
实验三:- J& s& z1 J5 Q) F7 S* e( d/ h
使用pthread_detach()设置线程分离,pthread_exit()退出后,系统自动回收,最后调用pthread_join()发现报错,说明线程分离后线程自动释放。" U( y/ y+ p( {4 [0 `8 w+ P
实验代码在detach.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
' `3 L7 d% v/ v1 F & N$ [3 q }9 P) \. s, B, ]
![]()
! m4 Y) L9 F9 v: H编译,gcc -o detach detach.c -lpthread,运行结果如下,发现使用pthread_join()报错:7 y4 L0 p0 V8 b4 V- ^/ J j1 U
& o; {' c) ^) ?, f" G: @9 N! L' G( v1 ^
|
|