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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 15:16 , Processed in 0.203125 second(s), 23 queries , Gzip On.

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

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

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