我一直在阅读http://www.linuxjournal.com/article/8144并考虑以下情况:
4253 /* Wait for kthread_stop */
4254 set_current_state(TASK_INTERRUPTIBLE);
4255 while (!kthread_should_stop()) {
4256 schedule();
4257 set_current_state(TASK_INTERRUPTIBLE);
4258 }
4259 set_current_state(TASK_RUNNING);
4260 return 0;
现在,如果在我们将进程设置为睡眠的第 4254 行之前调用了 kthread_stop,并且在该行之后我们实际上被抢占/调度并且进程也真的被发送到睡眠状态,会发生什么?
在这种情况下,唤醒呼叫是在更改状态之前收到的(因此它不会影响我们),并且操作系统的正常运行会在我们实际检查任何内容之前让我们进入睡眠状态。
我想我错过了一些东西,可能是以下两个选项之一:(1)状态的实际变化只发生在我们调用 schedule() 时,或者(2)我们没有办法被安排出来(要么在 set_current_state 调用之后和 schedule() 调用之前,通过抢占、中断等。
感谢您的帮助!