C++中Boost.Chrono时间库的使用方法
副标题[/!--empirenews.page--]
前言 大家应该都有所体会,时钟这个东西在程序中扮演者重要的角色,在系统编程的时候睡眠、带超时的等待、带超时的条件变量、带超时的锁都会用到,但是往往对特定系统依赖性很大,感觉即使不考虑系统的跨平台性,如果能使用一个稳定的接口,同时如果能够方便的对时刻、时段等进行相关的操作和运算,将是再好不过的了。 在boost库中和时间相关的库有Boost.DateTime和Boost.Chrono,前者专注于时间时刻以及本地化相关的内容,而后者主要是时刻、时长和时间的计算等内容。当然,C++11标准已经支持std::chrono了,但是为了兼容老编译系统现在很多C++库和程序都使用boost.chrono作为时间类库(还有的原因就是std::chrono没有收录boost.chrono的所有功能,比如统计CPU使用时间、自定义时间输出格式等),不过比较可惜的是即便使用boost::chrono作为权宜之计,也需要boost-1.47版本之上才行,而现在比较旧的发行版需要升级boost库才可以使用。想想现在RHEL-6.x仍然被大规模的部署,而且RedHat要为这货提供长达十年的技术支持,真不知道啥时候才能顺顺利利的享受C++11…… Boost.Chrono的时间类型分为duration和time_point,也就是时长和时刻两类,很多概念和接口都是围绕这两个维度去定义和实现的。 一、Clock clock是Boost.Chrono中的重要概念,而且这些clock都包含一个 (1) (2) (3) (4) (5) 二、time_point time_point代表时间点,其等价于某个时刻(clock)+duration的结果,同时两个time_point做减法也可以得到一个duration。time_point常见的描述为:3分钟之后、2038年1月1日10:32:23、定时器启动后的20ms…… 上面的clock都有一个now()成员函数,其返回的就是 Boost.Chrono有一个 chrono::process_real_cpu_clock::time_point p = chrono::process_real_cpu_clock::now(); std::cout << chrono::time_point_cast<minutes>(p) << 'n'; 三、duration 关于时长,
chrono::steady_clock::time_point start = chrono::steady_clock::now(); ... chrono::duration<double> sec = chrono::steady_clock::now() - start; std::cout << "we took " << sec.count() << " secondsn"; auto go = chrono::steady_clock::now() + chrono::nanoseconds(500); while (chrono::steady_clock::now() < go) ... ; 上面的六种time_point类型表示的维度不一,粗粒度的时长肯定能用细粒度的类型表示,反之则可能丢失精度,所以需要使用 可能上面六种类型的时间不咋的,但重点是现在boost::chrono被广为使用在boost的其他库里面,比如我们看一个条件变量的带超时等待的原型: template< typename Clock,typename Duration > cv_status wait_until( std::unique_lock< mutex > & lk,std::chrono::time_point< Clock,Duration > const& abs_time); template< typename Rep,typename Period > cv_status wait_for( std::unique_lock< mutex > & lk,std::chrono::duration< Rep,Period > const& rel_time); (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |