C++ sleep()与usleep()的区别及时间单位详解

Oliver
Oliver
发布时间:2026-10-15 | 1人浏览过
原创

在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 <&lt ", " << tv.tv_usec << endl;

    cout << "======================" << endl;

    // 2. 测试 usleep(0) - 让出剩余时间片
    gettimeofday(&tv, NULL);
    cout << "before usleep(0): " << tv.tv_sec <&lt ", " << tv.tv_usec << " microseconds" << endl;
    usleep(0); 
    gettimeofday(&tv, NULL);
    cout << "after usleep(0): " << tv.tv_sec <&lt ", " << tv.tv_usec << " microseconds" << endl;

    cout << "======================" << endl;

    // 3. 测试 usleep(100) - 挂起100微秒
    gettimeofday(&tv, NULL);
    cout << "before usleep(100us): " << tv.tv_sec <&lt ", " << tv.tv_usec << " microseconds" << endl;
    usleep(sleep_time); // 传入100
    gettimeofday(&tv, NULL);
    cout << "after usleep(100us): " << tv.tv_sec <&lt ", " << tv.tv_usec << " microseconds" << endl;

    return 0;
}

关键观察点:

  1. usleep(0) 的作用:即使参数为0,usleep(0) 也会触发调度器重新分配CPU时间片给其他线程,虽然耗时极短,但在微秒级计时器下可观察到微小的时间流逝,这体现了其非阻塞调度的特性。
  2. 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++时间控制函数的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表