Linux和Windows两种风格的操作系统,创建线程的方式有何不同?( 二 )


Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

文章插图
相关的C语言代码
其实就是将 kthread_create() 函数和 wake_up_process() 函数组合到一起而已 。Linux 的内核线程被启动后,会一直运行到调用 do_exit() 退出 。我们也可以调用 kthread_stop() 函数提前结束它,相关的C语言代码如下,请看:
Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

文章插图
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语言代码如下,请看:
Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

文章插图
wait_for_completion() 函数
稍稍跟踪一下C语言代码,发现其实这一等待过程是由 do_wait_for_common()函数实现的,它的C语言代码如下,请看:
Linux和Windows两种风格的操作系统,创建线程的方式有何不同?

文章插图
do_wait_for_common()函数
还是比较清晰的,这里就不再赘述了 。至此,我们就了解了Linux内核是如何创建线程并投入运行,以及如何结束内核线程的了 。
小结本节主要讨论了 Linux 内核中的线程的创建,应该能够看出,其实核心还是围绕对 task_struct 结构的管理,这与管理进程并无过多区别 。因此,说Linux中的线程只是一种特殊的进程,一点也不为过 。
欢迎在评论区一起讨论,质疑 。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!) 。




推荐阅读