C++并发实战14:时间

     std::chrono::system_clock::now()//返回系统当前时间

     时钟周期:std::ratio<1,25> //表示1s内25个周期

     std::chrono::system_clock::is_steady() //测试系统时钟周期是否可调

     std::chrono::duration<short,std::ratio<60,1> >  //时间间隔,第一个参数short(或long,double)表示数目count是个具体数字,第二个模板参数ratio<60,1>表示单位即一个时钟周期多少时间,这里是60s一个周期即1min。时间间隔之间的转换,小单位向大单位转换可能会被截取,如下:

std::chrono::milliseconds ms(54802);
std::chrono::seconds s=std::chrono::duration_cast<std::chrono::seconds>(ms);//54s

      wait类型的函数可以加上duration作为等待时间间隔,如下:

std::future<int> f=std::async(some_task);
if(f.wait_for(std::chrono::milliseconds(35))==std::future_status::ready)//在35ms内等待共享状态就绪,可能有三种情形返回:future ready,timeout,共享状态里有函数立即返回
 do_something_with(f.get());       

       duration还可以进行算术运算,如minutes(1) –seconds(55)结果为seconds(5),并且可以通过duration::count()获取时间间隔大小count,单位是模板实例化指定的,如:std::chrono::milliseconds(1234).count() 为1234。

        在chrono命名空间下的时间间隔:nanoseconds, microseconds, milliseconds, seconds,minutes,hours都是计时单位,比如可用于:this_thread::sleep_for(milliseconds(500))线程睡眠5ms,condition_variable t;  t.wait_for(unique_lock<mutex>& ,milliseconds(50))条件变量等待500ms

        时间点:依赖与一个时钟并且加上一个时间间隔表示一个具体的时刻,例如 std::chrono::time_point<std::chrono::system_clock, std::chrono::minutes> 依赖于系统时钟并以分钟计时,时间点可以与时间间隔duration做算术运算,时间点之间可以相减:

auto start=std::chrono::high_resolution_clock::now();
do_something();
auto stop=std::chrono::high_resolution_clock::now();
std::cout<<”do_something() took “<<std::chrono::duration<double,std::chrono::seconds>(stop-start).count()<<” seconds”<<std::endl;
        在wait_util中使用时间点的例子:

std::condition_variable cv;
bool done;
std::mutex m;
bool wait_loop()
{
 auto const timeout= std::chrono::steady_clock::now()+std::chrono::milliseconds(500);//时间点,一个具体的时刻,当前时钟时间加上一个偏移
 std::unique_lock<std::mutex> lk(m);
 while(!done)//通过检查条件防止虚假唤醒,即wait可能不是被notify唤醒的(可能是信号中断之类的原因)
 {
   if(cv.wait_until(lk,timeout)==std::cv_status::timeout)
   break;
 }
 return done;
}

     std::this_thread::sleep_for()和std::this_thread::sleep_until() //线程睡眠一个时间间隔和某个时刻

      std::timed_mutex比起mutex增加了两个成员函数:try_lock_for和try_lock_util用于等待一段时间和等到某个时刻。std::recursive_timed_mutex比recursive_mutex多了这两个成员函数。


你可能感兴趣的:(C++并发实战14时间)