linux 中的sleep相关函数

本文深入探讨了Linux内核中线程等待机制的实现原理,详细解释了几种常见的线程等待函数,如msleep、msleep_interruptible及sleep_on等,并展示了它们如何通过核心函数__set_current_state和schedule_timeout来实现线程的等待状态切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值