标题: kthread_create创建的内核线程中如何调用down?
如果用kernel_thread创建线程,在其中使用down和up很方便,但是通过kthread_create创建了线程A,然后通过down和up来控制其运行和睡眠状态,但是在模块卸载的时候确发现无法通过kthread_stop终止线程,请问有什么办法解决?还是只能通过schedule?
主要想让A循环处理命令队列Q,但是Q中的某些命令状态并不是都要处理,比如有状态1,2,3,4,5,只有状态1,5需要处理,但是如果让A不停遍历队列Q处理则效率很低,想让A每次遍历完一次队列即睡眠,当有状态改变时才唤醒A,有什么好办法嘛?
*********************************
我没有理解你的问题。
但是线程应该可以自然退出的, 你看看xfs的实现就知道了。
module加载的时候会建立几个线程。
有某个全局变量 __quited;
线程检查 __quited 是否为假否则作清理工作, 并退出。
rmmod的时候只需要将 __quited设置为真, 并等待线程的退出, 之后就返回了。
*********************************
你内核线程里的无限循环改为
while (!kthread_should_stop())
{
.........
}
kthread_should_stop()会去判断是不是有某人调用了kthread_stop去终止你的内核线程,如果是就会退出无限循环, 然后内核会通知kthread_stop,表明线程退出了,kthread_stop函数等到线程退出后才会返回.
阅读(1262) | 评论(0) | 转发(0) |