从boost库到时间戳

一、以问题引入
授权证书一般有到期时间的说法,公司测试同事在测试更新后的证书时,将系统时间调到了2050年,重启服务后发现各个进程的cpu占用率特别高;结合日志分析,发现这些进程 都在不停的刷heartbeat()的日志,也就是在频繁的进行心跳。

信息1:查看代码可知心跳间隔在配置文件中设置的是30秒
信息2:公司使用的mysql服务业在频繁重启,查看日志发现 This MySQL server doesn’t support dates later then 2038
信息3: 将系统时间调到2037年,发现mysql无问题,进程cpu占用率也下来了。

二、确定问题点或问题方向

#include <boost/date_time.hpp>						//boost的date_time模块的头文件
#include <boost/thread.hpp>
#include <iostream>int main(){while(1){auto sec = boost::posix_time::seconds(30); //心跳间隔30秒boost::this_thread::sleep(sec);std::cout<<"=== "<<sec<<std::endl;	       //使用cout代替心跳通信逻辑}return 0;
}

简化heartbeat()函数逻辑,分别在2037 2038 2050年测试,发现代码内采用的boost库计时功能在2038 2050年不准确(终端频繁打印输出)。
加上其他同事提示int32位存储时间戳会存在溢出的情况,就逐步确定问题是2038年时间戳的方向了

其他辅助:
相同测试代码在 boost-1.58 boost-1.71环境下对比,高版本始终无问题,低版本在2038年有问题,所以细分方向是boost-1.58版本的date_time模块在时间戳方便存在缺陷

三、boost低版本date_time模块在时间戳方面缺陷的解决方法
修改boost/date_time/time_resolution_traits.hpp 文件中 类模板time_resolution_traits的默认模板参数类型
typename var_type = boost::int32_t 替换为 boost::int64_t即可

对比boost-1.71版本内的该文件,可知1.67版本开始,官方已经开始采用int64_t类型来存储时间戳了

四、gdb定位流程(可选择性阅读)
图1
图1
图 2
在这里插入图片描述
图3
在这里插入图片描述

图4
在这里插入图片描述

图5
在这里插入图片描述

图6
在这里插入图片描述

图7
在这里插入图片描述

图8
在这里插入图片描述

图9
在这里插入图片描述

图10
在这里插入图片描述

图11
在这里插入图片描述
注:实际调试过程可能并没有这么精简

  • boost::this_thread 这个命名空间在哪个头文件定义的?
  • boost::this_thread::sleep()对应的头文件我找到了,但是函数重载了,会走到哪个函数呢?应该给哪个加断点呢?

五、复测
尝试将上述图11定位到的代码修改为int64_t, 再次测试,可以发现在2038年 2050年不会再存在问题

六、2038年时间戳的大致梳理

  1. int32_t 本质是 int 类型,即32位有符号整数,取值范围 − 2 31 -2^{31} 231 2 31 − 1 2^{31}-1 2311,即 − 2147483648 -2147483648 2147483648 2147483647 2147483647 2147483647
  2. 使用python脚本输出 2038年1月19日03:14:07 UTC 对应的时间戳,结果是 2147483647
from datetime import datetime, timezone  
import time  # 设置目标日期和时间(UTC)  
target_date_time = datetime(2038, 1, 19, 3, 14, 7, tzinfo=timezone.utc)  # 将datetime对象转换为时间戳(秒)  
timestamp = int(target_date_time.timestamp())  # 打印时间戳  
print(timestamp) 
  1. 使用gdb对时间戳进行尝试
(gdb) set $aa=2147483647    # 赋值32位有符号整型数的最大值给aa,对应的是 2038年1月19日03:14:07 UTC
(gdb) ptype $aa             # 打印aa的类型,结果是int
type = int
(gdb) p $aa                 # 打印aa的值
$8 = 2147483647
(gdb) set $aa=$aa+1         # aa+1,对应的是 2038年1月19日03:14:08 UTC
(gdb) ptype $aa             # 可以看到aa的类型不变
type = int
(gdb) p $aa                 # 超出了int类型的最大值,溢出了,直接变为int类型的最小值
$9 = -2147483648
(gdb)
  1. 如果时间戳采用64位整型数表示,情况会怎么样?
    先明确64位有符号整型数的取值范围 − 2 63 -2^{63} 263 2 63 − 1 2^{63}-1 2631,即 9223372036854775808 9223372036854775808 9223372036854775808 9223372036854775807 9223372036854775807 9223372036854775807
(gdb) set $bb=9223372036854775807    # 赋值64位有符号整型数的最大值给bb
(gdb) ptype $bb                      # 打印bb的类型,输出是long long
type = long long
(gdb) p $bb
$10 = 9223372036854775807
(gdb) p $bb/(12*30*24*60*60)         # 使用64位可以表示2965亿年的时间戳
$11 = 296533308798
(gdb)

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

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

相关文章

C++17并行算法与HIPSTDPAR

C17 parallel algorithms and HIPSTDPAR — ROCm Blogs (amd.com) C17标准在原有的C标准库中引入了并行算法的概念。像std::transform这样的并行版本算法保持了与常规串行版本相同的签名&#xff0c;只是增加了一个额外的参数来指定使用的执行策略。这种灵活性使得已经使用C标准…

AI 音乐大模型:创新的曙光还是创意产业的阴影?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

JavaScript Window History

JavaScript Window History 简介 JavaScript 中的 window.history 对象提供了与浏览器历史记录交互的能力。这个对象是 window 对象的一个属性,允许开发者访问和操作用户在浏览器中的导航历史。通过 window.history,开发者可以实现页面后退、前进以及添加新的历史记录等功能…

有效的字母异位词--力扣242

有效的字母异位词 题目思路C代码 题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。s 和 t 仅包含小写字母。 示例 1: 输入: s “an…

字符串的相关函数

1.strcpy 字符串拷贝函数 头文件&#xff1a; #include <string.h> char *strcpy(char *dest, const char *src); 参数&#xff1a; const char *src&#xff1a;被拷贝字符串的首地址 char *dest&#xff1a; 拷贝到目标的首地址 返回值&#xff1a; …

云原生-k8s中的 Tab 自动补全功能

文章目录&#xff1a; 1、首先你需要安装bash-completion&#xff0c;能够自动补全 2、配置环境变量 3、生效此配置 1、首先你需要安装bash-completion&#xff0c;能够自动补全 yum -y install bash-completion2、配置环境变量 echo source <(kubectl completion b…

[面试题]Kafka

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

RAG(检索增强生成)的演变:初级 RAG、高级 RAG 和模块化 RAG 架构

大型语言模型&#xff08;LLMs&#xff09;通过在自然语言任务及其它领域的成功应用&#xff0c;如 ChatGPT、Bard、Claude 等所示&#xff0c;已经彻底改变了 AI 领域。这些 LLMs 能够生成从创意写作到复杂代码的文本。然而&#xff0c;LLMs 面临着幻觉、过时知识和不透明、无…

磁力搜索器,解读新一代的搜索引擎方式,磁力王、磁力猫等引擎的异同及原理

最近国内几年&#xff0c;不依赖追踪服务器的磁力搜索开始流行&#xff0c;成为新的资源搜索的方式。 我们平常所说的磁力王&#xff08;jigecili.com)、磁力猫(yinghuacili.com)、bt磁力&#xff08;btcili.cn)、磁力狗最新版&#xff08;cilizhai.net)、磁力兔子、磁力宝、人…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

计算机网络知识点(五)

目录 一、简述什么是 MSL&#xff0c;为什么客户端连接要等待2MSL的时间才能完全关闭 二、简述 SYN flood&#xff0c;如何防止这类攻击 三、简述TCP 粘包和拆包 四、简述TCP 与 UDP 在网络协议中的哪一层&#xff0c;他们之间有什么区别&#xff1f; 五、简述从系统层面上…

个人制作软件是否需要代码签名证书?

在数字化时代&#xff0c;软件安全已成为企业和个人用户关注的焦点。为了保护软件免受恶意篡改和仿冒&#xff0c;代码签名证书应运而生。代码签名证书是一种数字证书&#xff0c;用于对软件进行数字签名和加密&#xff0c;以确保软件在传输过程中的安全性和可靠性。本文将详细…

【西瓜书】第一二章笔记

耽于学业&#xff0c;选择速记&#xff0c;后续再补。本笔记质量不高&#xff0c;敬请谅解。 关键词&#xff1a; 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a;一种机器学习范式&#xff0c;其中模型在带有标签的数据集上进行训练。标签提供了正确的答案&…

makefile追加warning日志

在Makefile中&#xff0c;你不能直接“追加”warning日志到构建过程中&#xff0c;但你可以通过几种方式在构建时产生额外的警告或消息。以下是一些常用的方法&#xff1a; 使用echo或printf命令&#xff1a; 在Makefile的规则中&#xff0c;你可以使用echo或printf命令来输出警…

10招教你玩转Python循环优化

更多Python学习内容&#xff1a;ipengtao.com 在Python编程中&#xff0c;循环是最常见的控制结构之一。尽管Python的循环语法简单明了&#xff0c;但在处理大量数据或进行复杂计算时&#xff0c;循环可能会成为性能瓶颈。本文将介绍10种加速Python循环的方法&#xff0c;帮助在…

[Linux] 系统的基本架构特点

Linux系统的基本结构 Linux is also a subversion of UNIX,it follows the basic structure of UNIX 内核(kernel)&#xff1a; 操作系统的基本部分 管理与硬件相关的功能&#xff0c;分模块进行 常驻模块&#xff1a;进程控制IO操作文件\磁盘访问 用户不能直接访问内核 外壳(s…

【杂记-浅谈OSPF协议和RIP协议区别】

RIP协议和OSPF协议的区别 1、两者概念不同2、运行方式不同3、底层运行方式不同 1、两者概念不同 路由信息协议RIP&#xff1a;分布式的基于距离向量的路由选择协议&#xff0c;RIP着重于数跳数&#xff1b;开放最短路径优先协议OSPF&#xff1a;使用分布式的基于链路状态的路由…

数据资产:打破数据孤岛,实现数据互联互通,构建企业智能化转型的重要桥梁。通过高效整合与利用数据资源,推动企业决策的科学化、精准化,助力企业迈向智能化新时代

目录 一、引言 二、数据孤岛现象及其影响 三、打破数据孤岛&#xff0c;实现数据互联互通 1、制定统一的数据标准和管理规范 2、建设统一的数据平台 3、推广数据共享和开放文化 四、数据资产在智能化转型中的重要作用 1、推动企业决策的科学化、精准化 2、优化企业运营…

盘点下常见 HDFS JournalNode 异常的问题原因和修复方法

盘点下常见 HDFS JournalNode 异常的问题原因和修复方法 最近在多个客户现场以及公司内部环境&#xff0c;都遇到了因为 JournalNode 异常导致 HDFS 服务不可用的问题&#xff0c;在此总结下相关知识。 1 HDFS HA 高可用和 JournalNode 概述 HDFS namenode 有 SPOF 单点故障…

【尚庭公寓SpringBoot + Vue 项目实战】移动端项目初始化(十九)

【尚庭公寓SpringBoot Vue 项目实战】移动端项目初始化&#xff08;十九&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】移动端项目初始化&#xff08;十九&#xff09;1、 SpringBoot配置2、Mybatis-Plus配置3、Knife4j配置4、导入基础代码5、导入接口定义代码6…