LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2835|回复: 2

kthread_create创建的内核线程中如何调用down?

[复制链接]
发表于 2008-6-25 23:07:06 | 显示全部楼层 |阅读模式
如果用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,有什么好办法嘛?
发表于 2008-7-4 16:16:15 | 显示全部楼层
我没有理解你的问题。
但是线程应该可以自然退出的, 你看看xfs的实现就知道了。
module加载的时候会建立几个线程。
有某个全局变量 __quited;
线程检查 __quited 是否为假否则作清理工作, 并退出。
rmmod的时候只需要将 __quited设置为真, 并等待线程的退出, 之后就返回了。
回复 支持 反对

使用道具 举报

发表于 2008-7-13 23:45:05 | 显示全部楼层
你内核线程里的无限循环改为
       while (!kthread_should_stop())
       {
                   .........
       }
kthread_should_stop()会去判断是不是有某人调用了kthread_stop去终止你的内核线程,如果是就会退出无限循环, 然后内核会通知kthread_stop,表明线程退出了,kthread_stop函数等到线程退出后才会返回.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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