chrono_Time_point (三)

news2024/10/5 10:24:22

chrono_time_point (三)

文章目录

  • chrono_time_point (三)
    • 模板参数
    • 源码解析
    • 构造函数:
    • 成员函数time_since_epoch()
      • 例子
    • timepoint提供的操作
    • timepoint的溢出
    • C和POSIX提供的Date/Time函数
      • 演示案例(timepoint和日历时间的转换)
  • 以计时器停滞线程
      • this_thread::sleep_until,用于将线程休眠直到某个时刻:
      • this_thread::sleep_for,用于将当前线程休眠多长时间:

模板参数

template <class Clock, class Duration = typename Clock::duration>
  class time_point;

std::chrono::time_point 表示一个具体时间,如上个世纪80年代、今天下午3点、火车出发时间等,只要它能用计算机时钟表示。

  • 第一个模板参数Clock用来指定所要使用的时钟(标准库中有三种时钟,system_clock,steady_clock和high_resolution_clock。见4时钟详解),第二个模板函数参数用来表示时间的计量单位(特化的std::chrono::duration<> )
  • 时间点都有一个时间戳,即时间原点。chrono库中采用的是Unix的时间戳1970年1月1日 00:00。所以time_point也就是距离时间戳(epoch)的时间长度(duration)。

源码解析

关键代码摘录如下(格式有调整):

template<class _Clock,	class _Duration = typename _Clock::duration> 
class time_point 
{ 
public: 
    typedef _Clock clock; 
    typedef _Duration duration; 
 
    constexpr time_point()	: _MyDur(_Duration::zero()) {} 
 
    constexpr explicit time_point(const _Duration& _Other)	: _MyDur(_Other) {} 
 
    template<class _Duration2, 
        class = typename enable_if<is_convertible<_Duration2, _Duration>::value,void>::type> 
    constexpr time_point(const time_point<_Clock, _Duration2>& _Tp)  : _MyDur(_Tp.time_since_epoch()) {} 
 
    constexpr _Duration time_since_epoch() const { return (_MyDur); } 
     
private: 
    _Duration _MyDur;	// duration since the epoch 
} 

注明:time_point要求其_Clock模板参数必须满足Clock的要求。

  • time_point的实现很简单,使用Duration类型的成员变量存储时间,make sense!
  • 仔细想想,时间点不就是从0时刻开始经过一定时间间隔的某一个时刻吗?

构造函数:

(1)time_point(); //默认构造函数,时间戳作为其值
(2)template <class Duration2> time_point (const time_point<clock,Duration2>& tp); //拷贝构造函数
(3)explicit time_point (const duration& dtn); //使用duration构造,就是距离时间戳的时间长度

成员函数time_since_epoch()

时间点有个重要的函数:duration time_since_epoch() (用于获取当前时间点距离时间戳的时间长度)

例子

即经常用来得到当前时间点到1970年1月1日00:00的时间距离、该函数返回的duration的精度和构造time_point的时钟(Clock)有关(见4时钟详解)。

#include <iostream>   
#include <chrono>   
#include <ctime>   
using namespace std;  
int main()  
{  
    //距离时间戳2两秒   
    chrono::time_point<chrono::system_clock, chrono::seconds> tp(chrono::seconds(2));  
    cout << "to epoch : " <<tp.time_since_epoch().count() << "s" <<endl;  
    //转化为ctime,打印输出时间点   
    time_t tt = chrono::system_clock::to_time_t(tp);  
    char a[50];  
    ctime_s(a, sizeof(a), &tt);  
    cout << a;  
    system("pause");  
    return 0;  
}  

timepoint提供的操作

  • timepoint提供的操作如下:

img

timepoint的溢出

  • 虽然timepoint的接口用了ratio,这确保了duration单元的溢出会导致编译器报错,但是duration的溢出还是可能会发生
  • 见下面的例子:

img

img

  • 这也说明了chrono是一个duration/timepoint程序库,而不是个date/time程序库。你可以计算duration和timepoint但仍然必须把epoch、最小和最大的timepoint、闰年和闰秒纳入考虑

C和POSIX提供的Date/Time函数

  • **C和POSIX提供的Date/Time函数介绍参阅:**https://blog.csdn.net/qq_41453285/article/details/102651298
  • *C++标准也提供了C和POSIX所提供的“处理date和time”接口*。原本在<time.h>内的宏、类型、函数,现在被定义在的namespace std内
  • 所提供的操作如下图所示:
    • 宏CLOCK_PER_SEC定义了clock()的单位类型(它返回的是elapsed CPU time,以1/CLOCK_PER_SEC秒计)
    • time_t通常只是“始自UNIX epoch(1970年1月1日)的秒数”。然而根据C和C++标准的说法,也并不保证如此

img

演示案例(timepoint和日历时间的转换)

img

img

img

以计时器停滞线程

  • Duration和timepoint可用于线程或程序(即主线程)的停滞(block)。停滞可以是无条件的,也可以指定最大时间段,或等待一个lock或某条件成立,或等待另一线程结束

  • 提供的操作如下:

    • **sleep_for()和sleep_until():**由this_thead提供用以停滞线程
    • **try_lock_for()和try_lock_until():**用来在等待一个mutex时指定最大时间段
    • wait_for()和wait_until():用来在等待某条件成立或等待一个future时指定最大时间段
  • 所有以…for()结尾的函数都会用到一个duration,所有以…until()结束的函数都会用到一个timepoint

    。例如:

    • this_thread::sleep_for(chrono::seconds(10)); //会停滞当前线程(不无可能是主线程)10秒钟
    • this_thread::sleep_until(chrono::system_clock::now()+chrono::seconds(10)); //停滞当前线程,直到system clock 来到一个“比此刻多10秒”的timepoint
  • 这些调用虽然看起来相同,其实不然:

    • *所有…until()函数,你需要传递一个timepoint,而它收到时间调整的影响*。如果sleep_until()之后的10秒内system clock被调整了,停滞时间也会被相应调整。例如我们把system clock回调1小时,这个程序将被停滞60分钟又10秒。又如果我们把clock调快超过10秒,timer会立刻结束
    • 如果使用…for()函数如sleep_for(),你必须传一个duration,或你使用steady_clock,那么system clock的调整通常不会影响duration。然而在一个不提供steady clock的硬件上,软件平台没机会在不受到“可能被调整的system time”的影响下计算秒数,因此时间的调整也会冲击…for()函数
  • 所有这些timer都不会保证绝对精准。对任何timer而言都存在一点点延迟,因为系统只是周期性地检查那个timer结束了,而timer和interrupt(中断)的处理又需要花费一些时间。因此,timer的时间长度将会是它们所指定的时间加上一小段(取决于实现的质量和当下情势)

this_thread::sleep_until,用于将线程休眠直到某个时刻:


#include <iostream>
#include <chrono>
#include <thread>
 
auto now() { return std::chrono::steady_clock::now(); }
 
auto awake_time() {
    using std::chrono::operator""ms;
    return now() + 2000ms;
}
 
int main()
{
    std::cout << "Hello, waiter...\n" << std::flush;
    const auto start {now()};                        //获取当前时间
    std::this_thread::sleep_until(awake_time());     //当前线程睡眠直到当前时刻的2000ms后
    std::chrono::duration<double, std::milli> elapsed {now() - start};    //线程唤醒,计算时差
    std::cout << "Waited " << elapsed.count() << " ms\n";
    return 0;
}
运行程序输出:

Hello, waiter...
Waited 1999.28 ms

this_thread::sleep_for,用于将当前线程休眠多长时间:

#include <iostream>
#include <chrono>
#include <thread>
 
int main()
{
    using namespace std::chrono_literals;
    std::cout << "Hello waiter\n" << std::flush;
    auto start = std::chrono::high_resolution_clock::now();
    std::this_thread::sleep_for(2000ms);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end-start;
    std::cout << "Waited " << elapsed.count() << " ms\n";
    return 0;
}
运行程序输出:

Hello waiter
Waited 2000.07 ms

chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> elapsed = end-start;
std::cout << “Waited " << elapsed.count() << " ms\n”;
return 0;
}


运行程序输出:

Hello waiter
Waited 2000.07 ms


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC | 使用Xml或注解进行开发

一、Spring MVC简介Spring MVC&#xff08;全称 Spring Web MVC&#xff09;是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架。MVC架构&#xff08;1&#xff09;示意图&#xff08;2&#xff09;各层职责Model&#xff1a;负责对请求进行处理&#xff0c;并将结果…

计算机SCI论文怎么发表?有哪些建议? - 易智编译EaseEditing

一般论文的水平是这样&#xff1a;普刊&#xff1c;核心&#xff1c;SCI。 不同的专业都可以发SCI&#xff0c;只是影响因子高低不用而已&#xff0c;有的领域分值高&#xff0c;有的偏低。 就是说不同领域SCI期刊&#xff0c;影响因子一样&#xff0c;但水平是一样的。 怎样…

三、元素操作

1、切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改&#xff0c;与Python中list的切片操作一样 ndarray数组可以基于0-n的下标进行索引&#xff0c;切片对象可以通过内置的slice函数&#xff0c;并设置start&#xff0c;stop及step参数进行&#xff0c;从原数组…

【Java寒假打卡】Java基础-反射

【Java寒假打卡】Java基础-反射概述获取Class对象的三种方式反射-获取Constructor对象利用Constructor数组创建对象获取Field对象反射获取成员变量并且使用反射获取成员对象反射获取成员对象并运行概述 Java反射机制&#xff1a;是在运行状态中&#xff0c;对于任意一个类&…

使用VS code快速搭建一个Golang项目

文章目录前言安装go语言环境了解Go开发相关的环境变量熟悉Go Module创建一个go项目项目迁移前言 VC code是一款巨好用的编辑器&#xff0c;使用vs code开发项目需要进行一些配置。项目中需要用到很多的包&#xff0c;无论是自己建的还是第三方的。由于go语言的生态环境没有jav…

【路由器连接天翼网关2.0问题解决思路】

文章目录一. 天翼网关如何切换新账号&#xff1f;背景操作流程1. 拔掉光纤2. 重置光猫3. 管理员页面进行认证4. 重新插上光纤&#xff0c;管理员页面会显示认证成功二、路由器连接光猫无网如何解决&#xff1f;背景操作流程1. 登陆普通管理员2. 获取超级管理员3. 登陆超级管理页…

SOLIDWORKS Electrical 2023新功能

电气工程师在完成电气原理图设计的同时&#xff0c;还需要频繁地修改、导出各报表&#xff0c;使得大量时间浪费在重复性的手动工作上。即便如此&#xff0c;也无法保证百分百准确无误&#xff1b;电气设计部门和机械设计部门虽然在设计同一产品&#xff0c;但不同部门之间互相…

云原生|kubernetes|2022年底cks真题解析(11-16)

前言&#xff1a; 接上一篇文章&#xff1a;云原生|kubernetes|2022年底cks真题解析&#xff08;1-10&#xff09;_晚风_END的博客-CSDN博客 2022年底的csk真题第二部分 11题到16题 十一&#xff0c; Trivy 扫描镜像安全漏洞 题目&#xff1a; Task 使用 Trivy 开源容器扫…

神奇的HTML系列专栏总目录

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/01/16&#x1f4c5; 最近更新时间&#xff1a;2023/01/16&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

《Linux性能优化实战》学习笔记 Day02

02 | 内存池&#xff1a;如何提升内存分配的效率&#xff1f; 原文摘抄 在 Linux 系统中&#xff0c;用 Xmx 设置 JVM 的最大堆内存为 8GB&#xff0c;但在近百个并发线程下&#xff0c;观察到 Java 进程占用了 14GB 的内存。为什么会这样呢&#xff1f; 绝大部分高级语言都…

【图论】「极简复习版」最短路径 Java/C++ 实现

文章目录Dijkstra —— 单源最短路讲解图解Java朴素使用堆优化C朴素使用堆优化Floyd —— 多源最短路讲解JavaCDijkstra —— 单源最短路 讲解 时间复杂度 朴素 Dijkstra&#xff1a;O(n2)O(n^2)O(n2) &#xff0c;nnn 是顶点数。堆优化 Dijkstra&#xff1a;O(mlogn)O(m\ l…

第五届字节跳动青训营 前端进阶学习笔记(三)CSS基本概念

文章目录前言CSS是什么1.CSS基本结构2.在面中使用CSS的方式3.CSS是如何工作的选择器1.通配选择器2.标签选择器3.id选择器4.类选择器5.属性选择器6.伪类选择器7.选择符颜色1.RGB颜色2.HSL颜色3.alpha透明度字体1.font-family2.font-size3.line-height4.text-align5.space6.text-…

从头搭建pytorch Docker镜像

目录前言正文从docker hub下载镜像创建容器并运行更新容器*安装python*安装anaconda安装pytorch参考文献&#xff1a;前言 此文不需要前言&#xff0c;请从正文开始 开始搭建 正文 默认大家都是有一定docker基础的&#xff0c;没有的话建议去花个20分钟学一下基础知识。相对…

如何利用极狐GitLab 轻松管理NPM依赖发布与更新?

本文来自&#xff1a; 任治桐 极狐(GitLab) 前端工程师 NPM 是 Node.js 的包管理工具&#xff0c;用来安装各种 Node.js 的扩展。本文将分享如何通过极狐GitLab&#xff0c;让 NPM 依赖发布更新更加快速和自动化&#xff0c;让你轻松管理依赖&#xff0c;拥有更多时间专注于核…

【Java|golang】1814. 统计一个数组中好对子的数目

给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i < j < nums.length nums[i] rev(…

算法之美~时间复杂度

时间复杂度 时间复杂度的全称是渐进时间复杂度&#xff0c;表示算法的执行时间与数据规模之间的增长关系1、只关注循环执行次数最多的一段代码2、加法法则&#xff1a;总复杂度等于量级最大的那段代码的复杂度3、乘法法则&#xff1a;嵌套代码的复杂度等于嵌套内外代码复杂度的…

文末有福利 | 零代码连接邮箱腾讯云企业网盘,附件管理超轻松

在日常工作中&#xff0c;想必大家每天都会收到各种各样的工作邮件&#xff0c;并且很多重要的文件材料也是通过邮件附件的形式来传输的&#xff0c;那么如何一站式管理这些文件&#xff0c;对于提高办公效率就至关重要了。关于邮件附件&#xff0c;相信大家也都碰到过这样的困…

【软件相关】Typora配置图片上传

文章目录0 前言1 确定需求2 开始配置2.1 软件储备2.2 插件安装2.3 gitee配置3 其他配置3.1 获取SMMS token参考链接0 前言 对于喜欢写Markdown文档的人来说&#xff0c;Typora无疑是一个写作利器&#xff0c;它有别于其他的Markdown软件&#xff0c;不是一边编辑一边渲染&#…

excel区分工时制度:如何计算996与955的工时差异

什么是996呢&#xff1f;是指早上9点上班&#xff0c;晚上9点下班&#xff0c;中午和晚上各有1小时吃饭时间&#xff0c;每周工作6天的工作模式。而955&#xff0c;也就是朝九晚五&#xff0c;中午就餐在工作时间内&#xff0c;但不能休息&#xff0c;共计8小时工作时间&#x…

[FUNC]在AHK中实现Pyhton的range函数

本文是用AutoHotkey复刻Python的range函数函数语法range(start, stop, step)参数说明&#xff1a;参数描述start计数从 start 开始。默认是从 0 开始。例如&#xff1a;range&#xff08;6&#xff09;等价于range(0,6)。stop计数到 stop 结束&#xff0c;但不包括 stop。例如&…