应优先使用 std::this_thread::sleep_for(),它跨平台、单位明确、无需条件编译;windows 下 sleep() 单位为毫秒易出错;posix 的 sleep() 单位为秒且语义不同,混用会导致兼容性问题。

Windows 下用 Sleep() 最简单,但注意单位是毫秒
Windows API 提供的 Sleep() 函数直接可用,头文件是 Windows.h,参数单位是毫秒,不是秒——这是最常踩的坑。想停 3 秒,得传 3000,传 3 就只停 3 毫秒,几乎看不出来。
- 必须包含
#include <windows.h></windows.h>,否则编译报错identifier "Sleep" is undefined -
Sleep(0)会让出当前时间片,不阻塞但触发调度,常用于忙等优化 - 该函数会阻塞整个线程,主线程调用时整个程序“卡住”,UI 程序慎用
跨平台首选 std::this_thread::sleep_for()
C++11 起标准库提供 std::this_thread::sleep_for(),可读性好、单位明确、无需平台判断。它接受 std::chrono 时长类型,比如 seconds、milliseconds,避免手算毫秒。
- 需要
#include <thread></thread>和#include <chrono></chrono> - 写法直观:
std::this_thread::sleep_for(std::chrono::seconds(2))表示睡 2 秒 - 在 Linux/macOS/Windows 上行为一致,无宏条件编译烦恼
- 注意:不能在不支持线程的 freestanding 环境(如裸机嵌入式)中使用
Linux/macOS 下别用 sleep()(小写)替代 Sleep()
POSIX 系统有同名函数 sleep()(小写),头文件是 unistd.h,但它单位是**秒**,且返回值语义不同:被信号中断时返回剩余秒数,不是 void。和 Windows 的 Sleep() 完全不兼容,混用会导致跨平台编译失败或逻辑错误。
- 误写
#ifdef _WIN32+Sleep()/#else+sleep()是常见错误模式 - 更安全的做法是统一走
std::this_thread::sleep_for(),彻底避开平台差异 - 若必须用 POSIX 原生接口,应改用
nanosleep()(精度更高,单位纳秒),但复杂度上升
睡眠期间无法响应输入或更新 UI,别在主线程硬等
无论用哪种方式,阻塞式睡眠都会让当前线程停滞,GUI 程序会冻结,命令行程序无法响应 Ctrl+C(除非信号处理另设)。这不是函数缺陷,而是设计使然。
- GUI 开发(Qt/Win32)应改用定时器(如
QTimer或SetTimer),把后续逻辑挂到回调里 - 需要“等待但保持响应”的场景,考虑异步方案:协程(C++20)、
std::future+wait_for(),或事件循环 - 调试时发现程序“假死”,先检查是否在主线程调了
sleep_for()或Sleep()
std::this_thread::sleep_for()。平台适配、单位混淆、信号中断这些麻烦事,标准库已经帮你挡掉了。真正难的从来不是“怎么睡”,而是“睡的时候还能不能干别的”。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











