C++时间操作
文章目录
- C++时间操作
- sleep系列
- sleep
- nanosleep
- std::this_thread::sleep_for
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>
头文件中定义的一个函数,它允许线程在指定的持续时间内休眠。相比于 sleep
和 nanosleep
,std::this_thread::sleep_for
提供了更高精度的延时控制,并且不会受到信号的影响而提前结束,还提供了更加面向对象和类型安全的延迟控制方式,并且可以与 <chrono>
库中的各种时间单位无缝配合。
函数原型如下:
template <typename Rep, typename Period>
void sleep_for(const std::chrono::duration<Rep, Period>& rel_time);
其中,Rep
是代表时间长度的类型(如 int
、long 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;
}
这个函数会阻塞当前线程直到指定的时间过去,但它仍然可能会受到操作系统调度的影响,实际休眠时间可能会略大于或小于指定时间。此外,如同 nanosleep
,std::this_thread::sleep_for
也可能被信号打断,但通常在信号处理完毕后会继续休眠剩余时间。