线程被唤醒后,用TASK_RUNNING调用set_current_state的必要性是什么?

时间:2014-05-18 20:49:40

标签: multithreading linux-kernel

据我所知,在Linux内核线程进入可中断睡眠状态后,它可能会被两件事唤醒:

  1. 通过wake_up家庭功能调用或
  2. 一个信号。
  3. 我在内核中看到了以下模式。我想知道在第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);
    

2 个答案:

答案 0 :(得分:3)

如果list_empty(&list_head)为false,则不会调用schedule()并进入睡眠状态。在这种情况下,它需要将自己的状态设置回TASK_RUNNING以防止意外睡眠。

答案 1 :(得分:1)

这是为了避免丢失唤醒问题。阅读this