
文章插图
相关的C语言代码
其实就是将 kthread_create() 函数和 wake_up_process() 函数组合到一起而已 。Linux 的内核线程被启动后,会一直运行到调用 do_exit() 退出 。我们也可以调用 kthread_stop() 函数提前结束它,相关的C语言代码如下,请看:

文章插图
kthread_stop() 函数
kthread_stop() 函数接收的参数为 kthread_create() 函数创建的结构体的 task_struct 成员 。从C语言代码可以看出,kthread_stop() 其实也是会调用 wake_up_process() 函数唤醒线程的,它在唤醒线程后,会等待线程函数退出,并不会调用 threadfn() 函数 。
这里需要注意,如果创建的线程函数 threadfn() 调用了 do_exit() 函数,最好就不要再调用 kthread_stop() 函数了 。kthread_stop() 函数等待线程退出是通过 wait_for_completion() 函数实现的,相关的C语言代码如下,请看:

文章插图
wait_for_completion() 函数
稍稍跟踪一下C语言代码,发现其实这一等待过程是由 do_wait_for_common()函数实现的,它的C语言代码如下,请看:

文章插图
do_wait_for_common()函数
还是比较清晰的,这里就不再赘述了 。至此,我们就了解了Linux内核是如何创建线程并投入运行,以及如何结束内核线程的了 。
小结本节主要讨论了 Linux 内核中的线程的创建,应该能够看出,其实核心还是围绕对 task_struct 结构的管理,这与管理进程并无过多区别 。因此,说Linux中的线程只是一种特殊的进程,一点也不为过 。
欢迎在评论区一起讨论,质疑 。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!) 。
推荐阅读
- 论述离骚的文学成就和影响 离骚成为我国什么主义文学的源头
- 本科一批、二批和三批的区别
- 荆轲为什么会为燕太子丹去行刺秦王 燕丹和荆轲
- 菊花和薏米泡茶的功效,菊花泡茶喝的常见问题
- 苦荞茶能不能吃,黑苦荞茶和黄苦荞茶哪个好
- 喝菊花茶的好处和坏处,男性喝红茶的好处和坏处
- 秦国和晋国是什么关系 秦国被晋国击败
- 太史慈什么时候投靠了孙策? 孙策和太史慈哪个厉害
- 苦芥茶的功效和作用,百合花茶的功效作用与泡法
- 灰鸭绒和白鸭绒的区别是什么?
