C++:详解C++11 线程休眠函数

休眠函数

  • 简介
  • 1: 让线程休眠一段时间
    • 1.1:std::chrono 的时钟 clock

简介

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
void sleep_for(const std::chrono::duration& sleep_duration);
比如:想要一个线程休眠 100ms
std::this_thread::sleep_for(std::chrono::millseconds(100));

#include 
#include 
#include

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
  1. 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秒

你可能感兴趣的:(#,C++基础点滴,c++,休眠函数)