据我所知,在Linux内核线程进入可中断睡眠状态后,它可能会被两件事唤醒:
我在内核中看到了以下模式。我想知道在第8行调用set_current_state(TASK_RUNNING)
的必要性是什么?它现在不在TASK_RUNNING
州吗?
1 set_current_state(TASK_INTERRUPTIBLE);
2 spin_lock(&list_lock);
3 if(list_empty(&list_head)) {
4 spin_unlock(&list_lock);
5 schedule();
6 spin_lock(&list_lock);
7 }
8 set_current_state(TASK_RUNNING);
9
10 /* Rest of the code ... */
11 spin_unlock(&list_lock);
答案 0 :(得分:3)
如果list_empty(&list_head)
为false,则不会调用schedule()
并进入睡眠状态。在这种情况下,它需要将自己的状态设置回TASK_RUNNING
以防止意外睡眠。
答案 1 :(得分:1)
这是为了避免丢失唤醒问题。阅读this。