当前位置: 首页 > java >正文

c++--线程休眠/sleep

线程休眠

<unistd.h>--sleep()

<thread>--std::this_thread::sleep_for()

ros--rclcpp::sleep_for()

以上的三个sleep也就是休眠会占用CPU吗

简单直接的回答是:不会。一个正确使用、正在休眠的线程不会占用CPU资源。

核心原理

当你调用像 std::this_thread::sleep_for() 这样的函数时,当前线程会从 运行状态(Running) 转变为 休眠状态(Sleeping / Blocked)

  1. 状态改变:操作系统内核的调度器会将该线程标记为“正在休眠”,并将其从 可运行队列(Ready Queue) 中移除。

  2. 调度决策:CPU调度器从此不再考虑这个线程,因为它不可运行。调度器会转而选择其他处于“可运行”状态的线程来执行。

  3. 唤醒机制:操作系统内核维护着一个计时器,当指定的休眠时间到期后,内核会将线程重新放回“可运行队列”,等待被调度器选中并在CPU上执行。

上面的休眠接口,主要用于的确需要让线程休眠等待指定时间的场景。

线程让出时间片

<thread>--std::this_thread::yield()

std::this_thread::yield() 的作用是主动让出当前线程剩余的 CPU 时间片,提示操作系统调度器立刻重新进行调度。

可以把它理解成一种礼貌的让步:“我现在没什么特别紧急的事要做,不如你先去执行其他可能更重要的线程吧”。

再次被调度的时间

注意,我们一般使用这个接口的格式:

      while (条件满足) {std::this_thread::yield();  // Don't busy wait}

使用这个接口,只是让当前线程主动放弃时间片,但是它并不会向操作系统注册while中等待的条件,注意区分这点,不要理解错误了。

而什么时候这个线程会被再次调度执行:

这个不确定,完全有操作系统自己决定。

http://www.xdnf.cn/news/19265.html

相关文章:

  • springboot提前注册bean
  • react组件
  • 【深度学习新浪潮】有没有什么方法可以将照片变成线描稿,比如日式漫画的那种?
  • Java高并发架构核心技术有哪些?
  • MySQL数据库迁移到KingbaseES完整指南
  • 类和反射的机制
  • Redis桌面客户端
  • Windows驱动开发与双机调试环境[驱动开发环境配置高阶]
  • 使用 Ansible 和 Azure Pipelines 增强您的 DevOps
  • Qt实战:如何打开摄像头并实现视频的实时预览
  • 2025年09月计算机二级Java选择题每日一练——第十二期
  • macOs上ffmpeg带入libx264库交叉编译
  • 【龙泽科技】汽车电气故障诊断仿真教学软件【迈腾380TSI】
  • WebGIS视角:体感温度实证,哪座“火炉”火力全开?
  • centos7中MySQL 5.7.32 到 5.7.44 升级指南:基于官方二进制包的原地替换式升级
  • xAI发布全新编码模型 grok‑code‑fast‑1!
  • Kafka 消费模型
  • Qt 窗口 - 3
  • 操作系统-虚拟内存篇
  • 机器学习中的欠拟合与过拟合
  • 2025年如何批量下载雪球帖子和文章导出pdf?
  • 每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)
  • web渗透PHP反序列化漏洞
  • 设计模式 - 静态工厂模式 + 策略模式,
  • 【一】Django框架版本介绍
  • k8s 定时任务需求模板
  • 手动安装的node到nvm吧版本管理的过程。
  • GaussDB生产扩容引起的PANIC问题处理案例
  • HarmonyOS元服务开发
  • HarmonyOS三方库的使用