找回密码
 注册
关于网站域名变更的通知
查看: 330|回复: 1
打印 上一主题 下一主题

迅为i.MX6ULL终结者线程基础线程终止与回收

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-3-8 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
线程终止:0 s; Y- e* t8 `) G3 V1 Y
1.start_routine回调函数执行return;
! `  X' f" }6 W- ]* T* R# c# g2.线程自身调用pthread_exit();
7 S$ Y, w& T; M% E# g3.其他线程调用pthread_cancel(ID)将此进程终止;3 r# B  Q  Y3 Z5 C, m6 P: T; w" ?9 K
任意线程调用exit()使整个进程退出。7 w: m4 K& w) B" f* a

8 c. d( X7 Y6 m线程回收:线程默认joinable状态,终止后需使用pthread_join回收资源;将子线程使用pthread_detach从主线程分离后处于unjoinable状态,系统等线程退出后自动回收资源。  _! v+ {) @& C2 U  T) w* O
常用的 函数调用如下:7 Y$ a; D; ~2 ]
pthread_exit():结束本线程: A/ Z  X7 o2 l/ s* W
#include
. U$ n5 D& {; vvoid pthread_exit(void *retval);
6 W8 x. Y( Y: C1 `/ s: w7 W" W) N参数含义:$ `* W& X) L* M) t5 _' l! [* b  T: @
retval:线程返回值,其他线程调用pthread_join()接收。4 _$ U$ H5 F# j2 k7 {

* T( U  l! d8 F0 fpthread_cancel():向指定线程发出取消请求,使用pthread_join回收,
# A  a9 z- R1 x#include
; d3 J2 \1 {" U6 \, F5 r0 M, wint pthread_cancel(pthread_t thread);- j! @) @9 Z/ v
参数含义:
8 b: N& m9 O6 G; K. y+ F; G# _thread:要终止的线程ID;
# O. u: l" _7 `  v: u返回值:执行成功返回0,成功不一定会让指定线程终止;执行失败返回错误号,/ y/ N$ v' Q+ A9 M5 a
7 h+ w% D% Z* [
pthread_join():等待线程终止回收资源,获取返回值retval,7 ?, E: g6 t( J* W0 O
#include
* w( D; A% S3 t2 Sint pthread_join(pthread_t thread, void **retval);* d' L: Z$ f$ ]" k
参数含义:
3 X& n) d* s, |  {$ C* U: J: v' n% t# sthread:线程 ID。
1 X2 E4 H, D( ~8 K0 _$ L$ c2 gretval:存放回收线程的返回值。
% M7 V: E. d) C$ w4 v1 i0 f返回值:成功返回0,失败返回错误号。0 o% ]8 D: P: Z
8 h; i  X' o- d
pthread_detach():分离线程,线程终止后系统自动清理,分离后不能再使用join获取状态,7 w! g5 p5 }! E7 K, y+ A; }
#include
$ m: d! r. P. C* U* A1 s$ gint pthread_detach(pthread_t thread);+ z9 c. ~: `9 R% Q) z+ Q
参数含义:要分离的线程 ID。
" h, U0 H, o& Y# |+ \9 T. K- p! e; q0 b8 y返回值:成功返回0,失败返回错误号。( {2 v% Y& }7 i) ^: Y
本章代码在thread/目录下,实验1:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。! q: c$ r, l- M. e
使用pthread_cancel让线程退出,pthread_join回收,代码在cancel.c:% G( n% b. Y* _8 J4 B# t6 E
: a/ l1 i3 |" t1 l! ~
编译:gcc cancel.c -o cancel -lpthread,运行结果:
2 o' A. `+ I) B  a) b: M# v7 t) N3 N$ \* i
使用pthread_exit让线程退出,pthread_join回收线程资源,代码在/thread/exit/目录下,
3 {9 n6 d# o4 n线程依次使用pthread_exit退出,然后pthread_join依次回收线程,main.c:
. w4 |. E8 |3 o" l7 r. B! N8 k
9 u8 U' E' G: e* M$ N4 }编译运行,可以看到线程按顺序依次退出并打印pthread_exit的返回值:
( F  }6 R1 M* B3 b$ C) E& Q( t7 ]5 G% F. ^/ P5 A3 h- n; |
实验三:+ w! a) c" f6 m$ ?, [+ d& K$ A
使用pthread_detach()设置线程分离,pthread_exit()退出后,系统自动回收,最后调用pthread_join()发现报错,说明线程分离后线程自动释放。
' M3 z8 G3 h9 A+ J! _9 w实验代码在detach.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
* M2 s" D1 w! m, g, x7 c$ F+ S) X  C! D
% v3 j; ]5 X" n9 e8 _" e7 C% T, F
编译,gcc -o detach detach.c -lpthread,运行结果如下,发现使用pthread_join()报错:# @" R+ [( G) G# b! m4 z: s6 c3 a

! f" p" ^& x$ A6 x2 A4 z5 X6 |% v$ T1 B# z

该用户从未签到

2#
发表于 2021-3-10 11:09 | 只看该作者
                                          
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-24 05:02 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表