简介
C++11 之前并未提供专门的休眠函数,C语言的 sleep、usleep函数其实是系统提供的函数,不同的系统函数的功能还要些差异。
- 在Windows系统中,sleep的参数是毫秒
- sleep(2*1000); // sleep for 2 seconds
- 在类Unix系统中,sleep()函数的单位是秒。
sleep(2); // sleep for 2 seconds
- 但是从C++11起,C++标准库提供了专门的线程休眠函数,使得你的代码可以独立于不同的平台。
std::this_thread::sleep_for
std::this_thread::sleep_untill
1: 让线程休眠一段时间
std::this_thread::sleep_for : 用于Block 当前线程一段时间。
函数原型:
template<class Rep, class Period>
void sleep_for(const std::chrono::duration<Rep,Period>& sleep_duration);
比如:想要一个线程休眠 100ms
std::this_thread::sleep_for(std::chrono::millseconds(100));
#include <iostream>
#include <chrono>
#include<thread>
int main(){
std::cout << "start wait......"<< std::endl;
/**
在C++11 中 chrono中有三种时钟:system_clock, steady_clock 和 high_resolution_clock
system_clock : 是不稳定的,因为时钟是可调的。它可以输出当前时间距离:1970年1月1日00:00的毫秒数
它一般用于需要得到 :绝对时点的场景。
steady_clock:一般用在需要得到时间间隔的场景。
high_resolution_clock:介于上面两者之间,时间精度比steady_clock()更精确
*/
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double,std::milli> elapsed = end-start;
std::cout<< "waited: "<< elapsed.count()<< " ms"<< std::endl;
}
打印结果
tart wait......
waited: 2000.06 ms
1.1:std::chrono 的时钟 clock
std::chrono是C++11引入的日期时间处理库,其中包含了3种时钟: system_clock,steady_clock ,high_resolution_clock 。如果需要使用高精度的时间,很自然就会想到使用 high_resolution_clock 。
1. system_clock: 用在需要得到绝对时间点的场景。
void test_system_clock(){
auto curTime = std::chrono::system_clock::now();
std::time_t tt = std::chrono::system_clock::to_time_t(curTime);
std::cout<< tt << " seconds from 1970-01-01 00:00:00 UTC"<< std::endl;
}
int main(){
test_system_clock();
}
// 打印结果:1677597162 seconds from 1970-01-01 00:00:00 UTC
- steady_clock: 用在需要得到时间间隔,并且这个时间间隔不会因为修改系统时间而受到影响的场景
void test_steady_clock(){
auto curTime = std::chrono::steady_clock::now();
// do something
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
auto curTime2 = std::chrono::steady_clock::now();
std::chrono::duration<double,std::milli> spendTime = (curTime2-curTime);
std::cout<< "耗时:"<< spendTime.count()<< "秒"<< std::endl;
}
int main(){
test_steady_clock();
}
// 打印:耗时:3000.07秒