c++ sleep函数怎么用_c++程序延时实现

发布时间 - 2026-01-05 00:00:00    点击率:
C++11起应优先使用std::this_thread::sleep_for()和sleep_until(),需配合和,传入std::chrono持续时间类型;避免POSIX sleep/usleep及Windows Sleep()等非标准函数,确保跨平台与类型安全。

sleep_for 和 sleep_until 是 C++11 起的标准做法

不要用 sleep()usleep() 这类 POSIX 函数,它们不是 C++ 标准,跨平台编译会失败(比如在 Windows MSVC 下直接报错 undefined reference)。C++11 引入了 std::this_thread::sleep_for()std::this_thread::sleep_until(),依赖 头文件,可移植、类型安全。

常见错误是传错时间单位:必须用 std::chrono 的持续时间类型(如 std::chrono::secondsstd::chrono::milliseconds),不能直接传整数毫秒。

  • 延时 500 毫秒:std::this_thread::sleep_for(std::chrono::milliseconds(500))
  • 延时 2 秒:std::this_thread::sleep_for(std::chrono::seconds(2))
  • 避免写成 sleep_for(500) —— 编译不过

Windows 下 _sleep() 和 Sleep() 容易混淆

Windows SDK 提供两个相似函数:_sleep()(来自 ?错,它实际在 ,已废弃且仅旧 MS-DOS 兼容环境支持)和真正可用的 Sleep()(注意首字母大写,参数单位是毫秒,需包含 )。

典型陷阱:

  • Sleep(1000)时 1 秒 —— 正确
  • sleep(1000)(小写)在 Windows 下不声明,链接时报错 LNK2019: unresolved external symbol sleep
  • _sleep(1000) 在现代 Visual Studio 中找不到定义,编译失败
/* Windows-only, not portable */
#include 
int main() {
    Sleep(1500); // 暂停 1.5 秒
    return 0;
}

Linux/macOS 下 nanosleep() 比 usleep() 更可靠

usleep(500000) 看似能休眠 500ms,但它已被标记为 obsolete(POSIX.1-2008 废弃),且某些系统上精度差、易被信号中断后提前返回。推荐用 nanosleep(),它支持纳秒级、可重入、中断后能续休。

关键点:

  • 参数是 struct timespec,不是毫秒整数
  • 必须检查返回值:若返回 -1 且 errno == EINTR,说明被信号打断,需手动重试
  • 别漏掉 #include #include
/* Linux/macOS 推荐(非 C++ 标准,但比 usleep 稳定) */
#include 
#include 
void safe_nanosleep(long ms) {
    struct timespec ts = {ms / 1000, (ms % 1000) * 1000000};
    while (nanosleep(&ts, &ts) == -1 && errno == EINTR);
}

sleep_for 在循环中卡死?小心 std::chrono::steady_clock 偏移

如果用 sleep_for() 写定时循环(比如每秒打印一次),但发现间隔越来越不准,可能是因为用了 system_clock 或没考虑线程调度延迟。正确做法是基于 steady_clock 计算下次唤醒时间,而不是固定间隔调用 sleep_for()

例如,想严格每 1000ms 执行一次任务,应记录上次执行时间,下一次目标时间为 last + 1s,再用 sleep_until() 补齐偏差。

  • 错误写法:while(true) { do_work(); sleep_for(1s); } → 实际间隔 = 执行耗时 + 1s
  • 正确写法:auto next = steady_clock::now() + 1s; while(true) { do_work(); sleep_until(next); next += 1s; }
  • 尤其在负载高或 do_work() 耗时波动大时,后者才能维持稳定周期

C++ 延时看似简单,但跨平台、精度控制、中断恢复、循环节拍这四点,任一处理不当都会导致行为意外。标准库的 sleep_for 是首选,但得配对用对 chrono 类型;平台特有函数只应在明确限定环境时使用,并做好条件编译。


# linux  # windows  # mac  # ai  # c++  # macos  # win  # cos  # 标准库  # while  # include  # auto  # errno  # 循环  # Struct  # 线程  # Thread  # undefined  # symbol  # visual studio  # 持续时间  # 是因为  # 已被  # 执行时间  # 用了  # 这类  # 时间为  # 应在  # 再用  # 报错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现模型的全局作用域?(Global Scope示例)  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  无锡营销型网站制作公司,无锡网选车牌流程?  如何安全更换建站之星模板并保留数据?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  手机网站制作与建设方案,手机网站如何建设?  如何基于云服务器快速搭建个人网站?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel集合Collection怎么用_Laravel集合常用函数详解  图册素材网站设计制作软件,图册的导出方式有几种?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何记录自定义日志?(Log频道配置)  Swift中swift中的switch 语句  EditPlus中的正则表达式实战(6)  如何快速生成高效建站系统源代码?  如何在阿里云域名上完成建站全流程?  PythonWeb开发入门教程_Flask快速构建Web应用  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何确保FTP站点访问权限与数据传输安全?  Laravel观察者模式如何使用_Laravel Model Observer配置  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何在服务器上配置二级域名建站?  Laravel如何实现文件上传和存储?(本地与S3配置)  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  JS经典正则表达式笔试题汇总  ,网页ppt怎么弄成自己的ppt?  如何获取上海专业网站定制建站电话?  清除minerd进程的简单方法  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何自定义分页视图?(Pagination示例)  Java垃圾回收器的方法和原理总结