线程休眠
<unistd.h>--sleep()
<thread>--std::this_thread::sleep_for()
ros--rclcpp::sleep_for()
以上的三个sleep也就是休眠会占用CPU吗
简单直接的回答是:不会。一个正确使用、正在休眠的线程不会占用CPU资源。
核心原理
当你调用像 std::this_thread::sleep_for()
这样的函数时,当前线程会从 运行状态(Running) 转变为 休眠状态(Sleeping / Blocked)。
状态改变:操作系统内核的调度器会将该线程标记为“正在休眠”,并将其从 可运行队列(Ready Queue) 中移除。
调度决策:CPU调度器从此不再考虑这个线程,因为它不可运行。调度器会转而选择其他处于“可运行”状态的线程来执行。
唤醒机制:操作系统内核维护着一个计时器,当指定的休眠时间到期后,内核会将线程重新放回“可运行队列”,等待被调度器选中并在CPU上执行。
上面的休眠接口,主要用于的确需要让线程休眠等待指定时间的场景。
线程让出时间片
<thread>--std::this_thread::yield()
std::this_thread::yield()
的作用是主动让出当前线程剩余的 CPU 时间片,提示操作系统调度器立刻重新进行调度。
可以把它理解成一种礼貌的让步:“我现在没什么特别紧急的事要做,不如你先去执行其他可能更重要的线程吧”。
再次被调度的时间
注意,我们一般使用这个接口的格式:
while (条件满足) {std::this_thread::yield(); // Don't busy wait}
使用这个接口,只是让当前线程主动放弃时间片,但是它并不会向操作系统注册while中等待的条件,注意区分这点,不要理解错误了。
而什么时候这个线程会被再次调度执行:
这个不确定,完全有操作系统自己决定。