Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57310
  • 博文数量: 13
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-08 16:58
文章分类

全部博文(13)

文章存档

2011年(1)

2009年(12)

我的朋友

分类: LINUX

2009-04-30 15:32:13

标题: 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函数等到线程退出后才会返回.
阅读(1240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~