線程休眠
<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中等待的條件,注意區分這點,不要理解錯誤了。
而什么時候這個線程會被再次調度執行:
這個不確定,完全有操作系統自己決定。