Linux 中的 sleep、usleep 与 nanosleep 使用区别
一、前言
在 Linux C/C++ 开发中,经常需要让程序暂停一段时间,例如等待设备初始化、控制线程启动间隔、降低循环执行频率等。
Linux 提供了多种休眠函数,其中比较常见的是 sleep()、usleep() 和 nanosleep()。
二、常见休眠函数
1. sleep()
sleep() 的单位是秒。
#include <unistd.h>
sleep(5); // 暂停 5 秒
适合较长时间的休眠,例如程序启动后等待设备就绪。
2. usleep()
usleep() 的单位是微秒(μs)。
#include <unistd.h>
usleep(200); // 暂停 200 微秒
usleep(100000); // 暂停 100 毫秒
换算关系:
-
1 秒 = 1000 毫秒
-
1 毫秒 = 1000 微秒
-
1 秒 = 1000000 微秒
适合需要使用微秒作为时间单位的场景。
3. nanosleep()
nanosleep() 的单位是纳秒(ns),可以通过结构体分别指定秒和纳秒。
#include <time.h>
struct timespec ts;
ts.tv_sec = 1;
ts.tv_nsec = 500000000;
nanosleep(&ts, nullptr); // 暂停 1.5 秒
相比 sleep() 和 usleep(),它可以更加灵活地指定休眠时间。
三、三种函数对比
| 函数 | 时间单位 | 典型使用场景 |
|---|---|---|
| sleep() | 秒 | 长时间等待 |
| usleep() | 微秒 | 短时间等待 |
| nanosleep() | 纳秒 | 灵活指定休眠时间 |
需要注意:时间单位更小,并不意味着实际休眠精度一定更高。实际休眠时间还受到操作系统调度、系统负载和定时器精度等因素影响。
另外,usleep() 在 POSIX.1-2008 中已被标记为废弃接口,新代码通常更推荐使用 nanosleep()。
四、实际开发中的注意事项
在多线程程序中,休眠只会让当前线程进入等待状态,不会主动暂停整个进程中的其他线程。
例如:
while (m_running)
{
processData();
std::this_thread::sleep_for(
std::chrono::milliseconds(200)
);
}
这里使用 C++ 标准库的 sleep_for(),让当前线程每次处理完数据后等待 200 毫秒。
五、总结
在 Linux C/C++ 开发中,休眠函数主要用于控制程序执行节奏。
-
sleep():适合秒级休眠。 -
usleep():适合微秒单位的休眠,但属于较旧接口。 -
nanosleep():提供更灵活的时间控制。 -
C++ 项目中也可以优先考虑
std::this_thread::sleep_for()。
选择合适的休眠方式,可以让程序的线程调度和执行逻辑更加清晰。
- 点赞
- 收藏
- 关注作者
评论(0)