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::seconds、std::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 */ #includeint 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垃圾回收器的方法和原理总结


时 1 秒 —— 正确