C++ sleep()与usleep()的区别及时间单位详解
在C++开发中,暂停当前执行流是常见的操作,主要依赖 sleep() 和 usleep() 函数。两者的核心差异在于时间精度:前者单位为秒,适合较长时间的延迟;后者单位为微秒,适用于需要精细控制的场景。本文将通过代码实验揭示其工作原理。
C++ sleep() 和 usleep() 基础区别
sleep() 和 usleep() 均用于暂停当前线程的执行,但参数所代表的物理单位截然不同。理解这一区别是避免逻辑错误的关键:
- sleep(time_t seconds):参数类型为秒(seconds)。它将当前线程挂起至少指定的秒数。
- usleep(useconds_t usec):参数类型为微秒(microseconds)。它将当前线程挂起指定的微秒数。注意:1秒 = 1,000,000微秒。
由于 usleep() 的单位极小,如果传入的参数过小(如几十或几百微秒),在普通控制台打印的秒级时间戳下,看起来可能像没有发生停顿。为了直观验证,我们可以通过改变时间查看方式来观察实际效果。
第1步:测试 sleep() 的秒级延迟
首先,我们通过一个简单的例子展示 sleep() 的行为。设置睡眠时间为100秒,对比调用前后的系统时间戳(以秒为单位)。
#include <time.h>
#include <stdio.h>
#include <iostream>
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[]){
int sleep_time = 100;
cout << "sleep before time: " << time(NULL) << endl;
// 挂起100秒
sleep(sleep_time);
cout << "sleep after time: " << time(NULL) << endl;
return 0;
}
运行结果分析:
输出显示两次时间戳之差正好为100。这证实了 sleep() 的参数直接对应秒数,线程被精确地挂起了100秒。
第2步:测试 usleep() 的微秒级延迟
接下来测试 usleep()。如果我们依然使用秒级时间戳打印,由于微秒相对于秒极其微小,肉眼几乎无法察觉变化。我们需要引入高精度计时方法来观察真实状态。
使用 <sys/time.h> 中的 gettimeofday() 结构体,可以获取秒和微秒级别的时间点。
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/time.h>
using namespace std;
int main(int argc, char *argv[]){
int sleep_time = 100; // 这里传入100微秒
// 1. 测试 sleep(100) - 挂起100秒
struct timeval tv;
gettimeofday(&tv, NULL);
cout << "start sleep(100s)..." << endl;
sleep(100);
gettimeofday(&tv, NULL);
cout << "after sleep(100s): " << tv.tv_sec << ", " << tv.tv_usec << endl;
cout << "======================" << endl;
// 2. 测试 usleep(0) - 让出剩余时间片
gettimeofday(&tv, NULL);
cout << "before usleep(0): " << tv.tv_sec << ", " << tv.tv_usec << " microseconds" << endl;
usleep(0);
gettimeofday(&tv, NULL);
cout << "after usleep(0): " << tv.tv_sec << ", " << tv.tv_usec << " microseconds" << endl;
cout << "======================" << endl;
// 3. 测试 usleep(100) - 挂起100微秒
gettimeofday(&tv, NULL);
cout << "before usleep(100us): " << tv.tv_sec << ", " << tv.tv_usec << " microseconds" << endl;
usleep(sleep_time); // 传入100
gettimeofday(&tv, NULL);
cout << "after usleep(100us): " << tv.tv_sec << ", " << tv.tv_usec << " microseconds" << endl;
return 0;
}
关键观察点:
- usleep(0) 的作用:即使参数为0,
usleep(0)也会触发调度器重新分配CPU时间片给其他线程,虽然耗时极短,但在微秒级计时器下可观察到微小的时间流逝,这体现了其非阻塞调度的特性。 - usleep(100) 的效果:前后时间戳的微秒部分发生了可见的变化(例如从 xxx491772 变为 xxx492xxx),差值接近100。这证明了参数确实是以微秒为单位的。
现代 C++ (11及以上) 的最佳实践
需要注意的是,usleep() 是非标准的 POSIX 函数,在 Windows 平台上默认不可用。在现代 C++ 开发(C++11 及更高版本)中,官方推荐使用标准库中的线程工具,它们具有更好的跨平台兼容性。
使用 <thread> 头文件中的 std::this_thread::sleep_for:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main(){
// 睡眠 1 秒
this_thread::sleep_for(chrono::seconds(1));
// 睡眠 500 毫秒
this_thread::sleep_for(chrono::milliseconds(500));
// 睡眠 100 微秒
this_thread::sleep_for(chrono::microseconds(100));
cout << "Time passed." << endl;
return 0;
}
总结
sleep() 和 usleep() 的主要区别在于时间单位的量级:秒 vs 微秒。在实际工程中,若需长时间等待且不在意微秒级精度,可使用 sleep();若需极短时间内的精细控制,可使用 usleep()。但对于跨平台项目,强烈建议升级到 C++11 标准的 std::this_thread::sleep_for,以获得统一的 API 和类型安全的延时控制。
以上就是C++ sleep()和usleep()的详细区别的详细内容,更多关于C++时间控制函数的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









