关于kthread_stop的疑问(linux3.16)

2024-01-06 15:20
文章标签 疑问 stop kthread linux3.16

本文主要是介绍关于kthread_stop的疑问(linux3.16),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。

之前找销毁内核线程的接口时,发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程。

最开始以为对于一个已经唤醒的内核线程,我们直接调用这个接口就能够让这个线程自动退出。后面经过试验发现并不是这样的======》kthread_stop只是通知线程退出,至于线程是否会退出,取决于线程的行为,即是否有kthread_should_stop动作,去检查,去主动退出

测试代码1

static struct task_struct *test_task;
struct task_struct *task;
struct timer_list timer;
int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}
int kill_thread(void* a)
{if (NULL != test_task){printk(KERN_EMERG "\r\n attempt kill test_thread\n");kthread_stop(test_task);printk(KERN_EMERG "\r\n kill test_thread complete\n");}return;
}
void timer_work(unsigned long data)
{wake_up_process(task);return;
}static int smsc911x_init(struct net_device *dev)
{
................	timer.expires=jiffies+msecs_to_jiffies(20000);timer.function=timer_work;init_timer(&timer);add_timer(&timer);printk(KERN_EMERG "\r\n create thread\n");//spin_lock(&lockdep_test);test_task = kthread_create(test_thread, NULL, "test_task");wake_up_process(test_task); task = kthread_create(kill_thread, NULL, "kill_task");//kthread_stop(test_task);printk(KERN_EMERG "\r\n create thread end\n");
.....................
}

log如下:可以看到在上面的代码样例中(kthread_should_stop必须要有这个),确实能够让内核线程退出

测试代码2 

将内核线程的处理函数里面的kthread_should_stop去掉,其他保持不变。看看会发生什么

int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){/*if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}*/msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}

log如下:可以看到。如果处理函数里面没有kthread_should_stop,即使通过kthread_stop通知内核线程应该退出了,但是内核线程不去检查是否应该退出,那么内核线程也是无法退出的。即kthread_stop是无法强制杀死内核线程的

测试 代码3

内核线程处理函数不要kthread_should_stop,在内核线程刚被创建并唤醒的时候,调用kthread_stop通知其退出。按照测试代码2,它应该不会主动退出的。但是实测这样是可以让内核线程退出的(甚至内核线程都没有被调度),这里没有想明白

static struct task_struct *test_task;
int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){/*if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}*/msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}static int smsc911x_init(struct net_device *dev)
{
........................	/*timer.expires=jiffies+msecs_to_jiffies(20000);timer.function=timer_work;init_timer(&timer);add_timer(&timer);*/printk(KERN_EMERG "\r\n create thread\n");//spin_lock(&lockdep_test);test_task = kthread_create(test_thread, NULL, "test_task");wake_up_process(test_task); //task = kthread_create(kill_thread, NULL, "kill_task");kthread_stop(test_task);printk(KERN_EMERG "\r\n create thread end\n");
......................................
}

log如下:可以看到内核线程打印的thread start,并且也搜到对应的内核线程

后面有时间研究一下这个是为什么

 使用注意事项

1、在执行kthread_stop的时候,目标线程必须没有退出,否则会Oops。原因很容易理解,当目标线程退出的时候,其对应的task结构也变得无效,kthread_stop引用该无效task结构就会出错。

2、内核线程的处理函数里面需要有kthread_should_stop,用于检查是否应该主动退出,否则线程是不会主动退出的。

这篇关于关于kthread_stop的疑问(linux3.16)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576760

相关文章

解决开机提示STOP:c0000218办法教程

“STOP:c0000218 {Registry File Failure}”是一个很典型的错误信息,造成错误的原因是硬盘错误或硬盘损坏。解决办法如下:   1. 从 Windows XP 光盘启动计算机。如果出现提示,请选择从光盘启动计算机必须选择的任何选项。   2. 当提示你选择“修复或故障恢复”时,请按R。这将启动Microsoft故障恢复控制台。   3. 根据提示,键

KEIL中编译51程序 算法计算异常的疑问

KEIL开发 51 单片机程序 算法处理过程中遇到的问题 ...... by 矜辰所致 前言 因为产品的更新换代, 把所有温湿度传感器都换成 SHT40 ,替换以前的 SHT21。在 STM32 系列产品上的替换都正常,但是在一块 51 内核的无线产品上面,数据莫名其妙的总会遇到异常的情况,弯弯绕绕了好一阵子,最后才发现是程序在执行一个不算复杂的算法的时候会出错。 那么本文的目的就是说明

关于电力系统的几个疑问

非电力专业人员对于电力中的某些知识不能够形成系统的认识,接下有空也有补充下这方面知识,吹水时候才有水可以吹,嘻嘻!这里舍不得删掉下边chatgpt这几张图片,暂时先保留着。因为一直有个因为在电网里边用发电端和用电端,但是究竟怎么来控制 根据用电端来控制发多少电的,希望阅读这本书后,能够自己来解答这个问题。

关于二极管在文氏桥振荡电路中稳幅的疑问

最近学习文氏桥振荡电路,对其中二极管自动稳幅的过程有些想不明白,电路仿真用的下图 仿真结果如下图 疑问 由于输出是正弦信号,前期的起振条件下,筛选出的信号会不断放大,放大到一定程度后二极管会导通,然后减小返回电阻,减小放大倍数,那此时一个周期的信号中肯定会有比二极管导通大的幅值,也有比二极管导通电压小的幅值,假如设下图中的 A 点为临界点,那么 A 左边的电压经过多轮反馈会越来越大,

放眼2018年,我们对虚拟现实产品有五大疑问

(52VR大幅修正了原译文的翻译错误,增添不少必要文段,并作润饰)       2017年对VR来说是一个繁忙的一年,虽然可能不像你预料的那样。VR头显价格下跌引起大家躁动,开发商们承认在VR行业里干不动(比如CCP公司),Oculus频繁占头条和别人打官司,当然了,也不全都只有坏事儿:头显价格下降了销量上升了,重要的游戏发布了。不过还是让整个行业感受到了危机感,就这样我们进

spyglass-lint关闭(disable/stop/waiver)规则

1.在verilog中disable检查 spyglass-lint可以在verilog代码中通过注释的方式disable掉某些检查,规则如下: // spyglass disable_block xxx// ... verilog code// spyglass enable_block xxx 其中xxx就是被disable的某一项规则。在disable_block和enable_b

Redis主从复制 常见疑问

【集群状态:一主二从】 1.从机从某个时间开始为slave,那么主机之前的数据从机是否可以备份? 可以。 2.从机可以set吗?  从机是不可以写操作的。 3.主句挂了,从机会选举上位?还是原地等待? 主机:SHUTDOWN  (1)从机的数据还在。 (2)从机原地等待,角色还是slave。 4.主机此时又回来了,此时集群状态? 主机还是主机,从机还是从机。 5.从机挂了,主机写操

记录java使用selenium驱动谷歌浏览器中的坑(三)ExecuteException:The stop timeout of 2000 ms was exceeded

错误信息: INFORMATION: Unable to drain process streams. Ignoring but the exception being swallowed follows.org.apache.commons.exec.ExecuteException: The stop timeout of 2000 ms was exceeded (Exit value:

Android13禁用Settings里面的Force Stop 強制停止按钮

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码修改 4.编译 5.彩蛋 1.前言 禁用Settings里面的 強制停止按钮,禁用下面这个按钮 2.问题分析 根据文本找到对应的位置 搜索 Force stop 或者 強制停止,结果 ./packages/apps/Settings/res/values/strings

Rabbit mq 虚拟机stop无法重启

之前从后台进去,这个地方死活无法重启 然后重启docker 以及mq都不行 docker exec -it <CONTAINER_ID_OR_NAME> /bin/bash rabbitmqctl stop_app rabbitmqctl start_app 最后删除虚拟机,然后重建就行了 rabbitmqctl delete_vhost / rabbitmqctl add_v