基本上,我已经使用kthread_create()创建了一个内核线程。这个线程反复地做一些事情。
while() {
//do something
msleep_interruptible(1000);
}同时,当达到某个条件(例如,调用一个特定的syscall,或者某个特定的用户空间进程被终止)时,我想要关闭这个线程。我读过kthread.c,但只找到了kthread_stop(),这与kill -9不一样。它所做的仅仅是在KTHREAD_SHOULD_STOP函数主体和kthread->flag中设置kthread_should_stop()位,必须调用kthread_should_stop()来查询该位并单独调用do_exit()。
我尝试过如下的方法。问题是,当调用kthread_stop()时,k线程通常处于休眠状态(即msleep_interruptible(1000))。因此,我总是观察到调用kthread_stop()与k线程真正退出之间的延迟。在我的项目中,这导致了一个无法忍受的延迟。我想要的就像kill -9,也就是说,在我调用kthread_stop()之后,这个线程将立即终止。以及意识到这一点的想法?
while(!kthread_should_stop()) {
//do something
msleep_interruptible(1000);
}发布于 2014-09-26 21:05:51
我已经找到了解决问题的办法。这不是因为睡眠(即msleep_interruptible(1000))。实际上,这个函数确实允许中断,而且kthread_stop()还执行wake_up_process()来在设置KTHREAD_SHOULD_STOP之后唤醒目标KTHREAD_SHOULD_STOP。因此,理想情况下不存在任何问题,这意味着无论msleep_interruptible()的参数是什么,只要调用kthread_stop(),就应该很快地唤醒和终止该线程。
然而,有一个“失去唤醒”的比赛条件(我受到了这个职位的启发,它显示了一个与我非常相似的问题)。棘手之处在于,msleep_interruptible()本质上包含两个方法,set_current_state(TASK_INTERRUPTIBLE);和schedule_timeout();,而kthread_stop()可以在这两个方法之前执行。所以命令会是这样的:
[kthread]: //do something
[my syscall]: wake_up_process(kthread); //inside kthread_stop()
[kthread]: set_current_state(TASK_INTERRUPTIBLE);
[kthread]: schedule_timeout();因此,wake_up_process()将简单地被k线程忽略。要解决这个问题,必须将set_current_state(TASK_INTERRUPTIBLE);和schedule_timeout();解耦。到目前为止,下面的代码运行良好。
while(!kthread_should_stop()) {
//do something
set_current_state(TASK_INTERRUPTIBLE);
if (kthread_should_stop()) {
break;
}
schedule_timeout();
}从这个意义上说,内核中确实有一种方式可以杀死一个像kill -9一样的线程。
https://stackoverflow.com/questions/26050745
复制相似问题