C++时间操作

C++时间操作

sleep系列

sleep

sleep 是在计算机编程中用于暂停当前进程或线程一段时间的函数。让程序暂停执行指定的秒数。

sleep 函数在 <unistd.h> 头文件中定义,其原型如下:

unsigned int sleep(unsigned int seconds);

此函数会让当前进程暂停执行至少 seconds 秒。请注意,sleep 返回的值是剩余未睡眠的秒数,如果睡眠期间收到了信号并被处理,则可能提前结束睡眠。

nanosleep

nanosleep 是一个POSIX标准的系统调用,用于使当前进程或线程暂停执行指定的纳秒(十亿分之一秒)时间。相比于 sleep , nanosleep 提供了更高的时间精度。

在C语言中,nanosleep 函数的原型通常定义在 <time.h> 头文件中:

#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

函数参数:

  • req:指向一个timespec结构体的指针,该结构体中包含了请求的睡眠时间(秒和纳秒)。
  • rem:如果函数由于接收到信号而提前返回,此参数会填充剩余的睡眠时间。如果不需要这个信息,可以传入NULL。

timespec 结构体的定义如下:

struct timespec {
    time_t tv_sec;     // 秒
    long   tv_nsec;    // 纳秒
};

示例:

#include <time.h>
#include <stdio.h>

int main() {
    struct timespec req = {0, 100000000}; // 请求休眠1秒(1秒 = 1000000000纳秒)

    if (nanosleep(&req, NULL) == -1) {
        perror("nanosleep");
    }

    // 程序在此处将继续执行,经过了至少1秒的延迟
    printf("Sleep finished.\n");

    return 0;
}

在这个示例中,程序将休眠1秒(100000000纳秒)。如果在休眠期间收到了信号并且没有被阻塞或忽略,nanosleep 将返回错误(EINTR),并可以通过 rem 参数获取剩余的睡眠时间。

std::this_thread::sleep_for

std::this_thread::sleep_for 是 C++11 标准库中 <chrono> 头文件中定义的一个函数,它允许线程在指定的持续时间内休眠。相比于 sleepnanosleepstd::this_thread::sleep_for 提供了更高精度的延时控制,并且不会受到信号的影响而提前结束,还提供了更加面向对象和类型安全的延迟控制方式,并且可以与 <chrono> 库中的各种时间单位无缝配合。

函数原型如下:

template <typename Rep, typename Period>
void sleep_for(const std::chrono::duration<Rep, Period>& rel_time);

其中,Rep 是代表时间长度的类型(如 intlong long 等),Period 是一个表示时间周期的类型(如 std::ratio<1> 表示秒,std::milli 表示毫秒,std::nano 表示纳秒等)。

示例:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    // 休眠1秒
    std::this_thread::sleep_for(std::chrono::seconds(1));

    // 休眠500毫秒
    std::this_thread::sleep_for(std::chrono::milliseconds(500));

    // 休眠100纳秒
    std::this_thread::sleep_for(std::chrono::nanoseconds(100));

    std::cout << "Sleep finished.\n";

    return 0;
}

这个函数会阻塞当前线程直到指定的时间过去,但它仍然可能会受到操作系统调度的影响,实际休眠时间可能会略大于或小于指定时间。此外,如同 nanosleepstd::this_thread::sleep_for 也可能被信号打断,但通常在信号处理完毕后会继续休眠剩余时间。


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值