以下sleep函数都是认当前线程进入等待队列,跟踪代码后发现最终都是通过调用以两条语句来实现线程等等的。
__set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(timeout);
1、msleep()
2、msleep_interruptible()
3、sleep_on(wait_queue_head_t *q)
4、sleep_on_timeout(wait_queue_head_t *q, long timeout)
5、interruptible_sleep_on(wait_queue_head_t *q)
6、interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
msleep()
schedule_timeout_uninterruptible()
__set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(timeout);
setup_timer_on_stack();
schedule();
destroy_timer_on_stack();
msleep_interruptible()
while (timeout && !signal_pending(current))
timeout = schedule_timeout_interruptible(timeout);
__set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(timeout);
sleep_on(wait_queue_head_t *q)
sleep_on_common(q, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
wait_queue_t wait;
init_waitqueue_entry(&wait, current);
__set_current_state(state);
__add_wait_queue(q, &wait);
timeout = schedule_timeout(timeout);
__remove_wait_queue(q, &wait);
sleep_on_timeout(wait_queue_head_t *q, long timeout)
sleep_on_common(q, TASK_UNINTERRUPTIBLE, timeout);
interruptible_sleep_on(wait_queue_head_t *q)
sleep_on_common(q, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
return sleep_on_common(q, TASK_INTERRUPTIBLE, timeout);