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