Linux 时间戳localtime函数多线程编程的一些坑

localtime的多线程问题 工作中遇到的问题:设备需要上传图片到云平台,在上传失败时会进行重传,但在重传时却找不到对应的文件(文件命令方式为:日期_时间_id.jpg,如:2021-04-19_09_48_33_123456.jgp,文件名中的id是唯一的)。文件名中的日期-时间是从数据库里取出,然后再组成文件名字符串,再取文件进行上传。问题就是:id跟上传失败的文件id一样,但日期时间却不一样,本应该取上传失败的文件进行重传,结果文件名不一样导致找不到文件。 原因:在从数据库中取得文件信息后,信息里有文件的时间戳,当用localt 阅读详情

在Linux多线程编程中,我们经常需要获取系统时间,一般是使用以下方式获取系统的时间信息:

int example()
{
	time_t 				unTimeStamp = 0;
	struct tm 			*pstTm;

	unTimeStamp = time(NULL);

	pstTm = localtime(&unTimeStamp);
	if(pstTm != NULL) 
    {
		printf("(%d/%d/%d-%d)", pstTm->tm_hour, pstTm->tm_min, pstTm->tm_sec);
	}
    return 0;
}

以上方式获取系统Linux时间似乎并没有问题,但在多线程的程序中,如果在不同线程使用localtime()函数对时间戳进行转换,然后打印可能会看到时间有错误,如果两个线程解析不同的时间戳timestamp时,打印结果以最近一次解析为主。

int example2()
{
	time_t 				unTimeStamp0 = 0;
    time_t 				unTimeStamp1 = 1543833659;
	struct tm 			*pstTm0;
    struct tm 			*pstTm1;

	unTimeStamp0 = time(NULL);

	pstTm0 = localtime(&unTimeStamp0);

    pstTm1 = localtime(&unTimeStamp1);


	if(pstTm0 != NULL) 
    {
		printf("pstTm0 ---->(%d/%d/%d-%d)", pstTm0->tm_hour, pstTm0->tm_min, pstTm0->tm_sec);
	}

    if(pstTm1 != NULL) 
    {
		printf("pstTm1 ---->(%d/%d/%d-%d)", pstTm1->tm_hour, pstTm1->tm_min, pstTm1->tm_sec);
	}

    return 0;
}

从上述可以看到,原本pstTm0打印的内容应该和pstTm1不同的,但是实际打印出来的却是一样的。原因是localtime()解析出来的时间戳保存在全局的一段内存里面,每次调用localtime()函数将更新里面的时间信息,所以如果多线程编程时,需要注意这个坑!

解决办法是:调用其它解析函数进行解析或自己写一个也行。

 

C++时间处理实战:从time_t到localtime,掌握时间戳与日期转换 时间戳是计算机系统中表示时间点的核心概念,通常以自Unix纪元(1970年1月1日)以来的秒数存储。其原理是将连续的时间离散化为整数,便于存储、计算和跨平台交换。在C/C++编程中,标准库提供了`time()`函数获取当前时间戳,返回`time_t`类型值。这一基础机制为日志记录、性能分析和任务调度等场景提供了统一的时间基准。然而,将时间戳转换为人类可读的日期时间格式时,需使用`localtime()`函数进行转换,该函数会依据系统时区设置将UTC时间戳解析为包含年、月、日等字段的`tm`结构体。值得注意的 阅读详情

相关推荐

Linux C编程实战:localtime_r的隐藏陷阱与时区问题解决方案

本文深入探讨了Linux C编程中localtime_r函数的使用陷阱与解决方案。尽管localtime_r是线程安全的,但开发者仍需警惕其潜在的时区失效与死锁风险,特别是在动态修改TZ环境变量后未调用tzset(),或在信号处理函数中使用时。文章提供了包括正确调用tzset()、实现信号安全方案及构建健壮时间工具库在内的实战解决方案。

weixin_29012765的博客 377

localtime()使用陷阱及解决方法(localtime()连续使用问题)

函数简介 C 库函数struct tm *localtime(const time_t *timer)使用 timer 的值来填充tm结构。timer的值被分解为tm结构,并用本地时区表示。 该函数返回指向tm结构的指针,该结构带有被填充的时间信息。下面是 tm 结构的细节 struct tm { int tm_sec; /* 秒,范围从 0 到...

monkeyzh123的专栏 7432

从信号处理到fork安全:localtime_r函数在Linux系统编程中的5个致命场景

本文深入剖析了localtime_r函数在Linux系统编程中的五个致命陷阱,特别是信号处理函数中的死锁风险。虽然localtime_r是线程安全的,但在信号处理、fork调用等场景下并非信号安全,可能导致服务死锁或崩溃。文章提供了具体的代码示例和解决方案,帮助开发者避免这些深水区隐患,编写更健壮的系统程序。

weixin_29000991的博客 258

C库的非线程安全函数,以localtime函数为例

C库中存在一些非线程安全函数,因为最初编写CRT时还没有多线程技术,所以很多函数内部使用了全局变量或函数内部的静态变量。随着多线程技术的出现,很多函数都有了对应的多线程安全版本。函数返回的是一个指针,但是外部却不需要释放这个指针指向的内存,因此其内部使用了一个全局变量或函数内部的静态变量。因此两次调用该函数,第2次的结果就覆盖了第1次的结果(二者返回的指针指向同一个地址)。两个时间差了1000秒,但是输出结果却一样。作者:iCrystal。

weixin_41701847的博客 939

localtime_r vs localtime_s vs localtime:线程安全与跨平台时间转换的终极指南

本文深入比较了localtime、localtime_r和localtime_s三种时间转换函数的线程安全性与跨平台特性。通过详细分析各函数的使用场景、参数差异和潜在陷阱,为开发者提供全面的选型指南和跨平台解决方案,帮助避免常见的时间处理错误。

weixin_30342209的博客 382

Linux C语言获取微秒级时间戳:gettimeofday函数详解与性能测量实践

在系统编程和性能优化中,时间戳是记录事件发生时刻、测量代码执行时间的基础工具。Linux系统提供了多种时间获取接口,其中gettimeofday函数因其微秒级精度和广泛兼容性,成为嵌入式开发、网络编程和性能分析中的常用选择。该函数通过返回自Unix纪元以来的秒数和微秒数,为开发者提供了精确的时间基准。理解其底层数据结构struct timeval和微秒字段tv_usec的有效范围,是避免常见精度陷阱的关键。在工程实践中,gettimeofday不仅用于生成带毫秒的日志时间戳,更是实现高精度耗时测量的核心。通

weixin_30847939的博客 377

使用time函数和localtime函数实现获取当前时间,以及解决visual studio 报错localtime不安全的问题

1、time函数返回的是距离1970-1-1,00:00:00所经过的秒数 成功:返回秒数 失败:返回-1 头文件是 #include<ctime> (或者c版本)#include<time.h> 一般用法 #include<iostream> #include<ctime> using namespace std; int main() { const time_t t=time(NULL); cout<<"t="<<t&

qpfxgg的博客 6013

linux库函数 gettimeofday() & localtime的概念和使用案例

linux库函数 gettimeofday() & localtime的概念和使用案例

weixin_42108533的博客 2052

linux获取的localtime不准确,导致程序获取的时间也出现问题,解决办法如下

因为LINUX的本地时间获取不准确,导致我程序的获取的获取时间不准确。1、首先添加脚本文件到usr/sbin/的目录下。# 使用 rdate 同步 UTC 时间。# 获取同步后的 UTC 时间的秒数表示。# 将秒数表示转换为日期时间格式。# 将新的本地时间设置为系统时间。# 计算新的本地时间的秒数表示。# 定义要增加的小时数。

m0_67545273的博客 1393

用Python实现一个猜密码的程序

我们用Python实现猜密码

sk6584631_sz的博客 1261

基于单片机自行车码表控制系统设计

*单片机设计介绍,基于单片机自行车码表控制系统设计。

QQ2193276455的博客 1487

Linux时间编程避坑指南:localtime线程安全问题与localtime_r的正确使用姿势

本文深入探讨Linux时间编程中localtime函数的线程安全问题,并详细介绍线程安全的替代方案localtime_r的正确使用方法。通过分析静态变量导致的竞态条件,提供多线程环境下的最佳实践和性能优化建议,帮助开发者避免常见的时间处理陷阱,提升服务器和网络服务的稳定性与性能。

weixin_30268071的博客 940

芯片设计中的STA实战:如何避免时序违例(含常见问题解析)

本文深入探讨了芯片设计中静态时序分析(STA)的实战应用,重点解析了如何避免时序违例。文章从STA的核心逻辑与约束制定出发,强调了将时序意识植入RTL编码与综合阶段的重要性,并详细介绍了后端物理实现中的时序收敛策略。同时,针对跨时钟域路径误报、多工艺角违例等常见问题提供了深度解析与调试技巧,旨在帮助IC设计工程师系统性地掌握时序分析与优化方法。

open4的博客 513

Linux获取当前时间日期asctime, asctime_r, gmtime, gmtime_r, localtime, localtime_r, mktime

本篇记录Linux环境下获取当前时间日期的函数asctime, asctime_r, gmtime, gmtime_r, localtime, localtime_r, mktime的基本使用。

chenyijun的专栏 1243

机器学习教程 之 半监督学习 Co-training 协同训练 (论文、算法、数据集、代码)

这篇博客介绍的是一篇用于半监督分类问题的方法: 协同训练 Co-training, A. Blum and T. Mitchell, “Combining labeled and unlabeled data with co-training,” in Proc. of the 11th Annual Conf. on Computational Learning Theory, 1998.,这算是半监督领域里面始祖级的论文了,是1998年两位CMU大佬提出的方法。 之前还写过一篇关于Tri-trainin

冯良骏 的 博客 1万+

k-shape时间序列聚类实战:从理论到tslearn实现

本文深入探讨了k-shape时间序列聚类算法,从核心原理到tslearn库的实战应用。k-shape通过标准化互相关系数衡量序列形状相似性,专注于识别波动模式而非绝对数值。文章详细介绍了算法流程、Python环境搭建、数据预处理、最佳K值确定方法,并通过完整代码示例展示了模型训练与结果可视化,帮助读者掌握这一强大的“形状捕手”工具。

weixin_29061465的博客 174

localtime使用注意事项

localtime多线程调用

火红色祥云 1746

超越防抖:索尼CXD5254GG芯片如何重新定义电子影像稳定

索尼CXD5254GG芯片通过融合6轴IMU与图像传感器数据,重新定义了电子影像稳定技术。其核心突破在于实时地平线校正、抑制果冻效应和镜头畸变校正,并搭载智能画质控制器提升画面细节。该芯片适用于广播制作、体育娱乐、安防监控和机器人视觉导航等专业领域,提供开箱即用的优化参数配置,大幅缩短开发周期。CXD5254GG不仅实现稳定成像,更通过姿态感知与智能优化,为专业影像应用提供了完整的稳定解决方案。

致力于lidar应用开发 114

多线程编程中如何安全处理本地时间?localtime_r vs localtime_s实战对比

本文深入对比了多线程编程中处理本地时间的两种线程安全函数`localtime_r`和`localtime_s`,详细解析了它们在Unix-like系统和Windows平台上的应用差异及最佳实践。通过实战案例和代码示例,帮助开发者避免线程竞争问题,确保时间处理的准确性和跨平台兼容性。

yhn456789的博客 548

SmartFusion从FPGA到ARM系列教程

前言 本系列教程,将会以Microsemi SmartFusion一代芯片A2F200M3F为例,简单介绍片上ARM Cortex-M3 硬核 MCU 基本外设的使用,及其与FPGA逻辑模块进行交互的示例。 在学习片上硬核ARM Cortex-M3 MCU的开发之前,要先熟悉Microsemi Libero SoC开发环境的使用,可以参考:Microsemi Libero SoC系列教程 关于Microsemi SmartFusion混合型FPGA的介绍,可以参考:Microsemi SmartFusio.

whik1194的博客 8293

结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式

高速列车是现代交通运输的重要组成部分,其运行速度高、载客量大,对安全性和可靠性提出了极高的要求。轴箱轴承作为高速列车的关键部件之一,承担着传递载荷和支撑车轴的重要作用。然而,由于长期运行在高速、重载和复杂工况下,轴箱轴承容易出现疲劳磨损、润滑失效和裂纹等故障,从而影响列车的安全性。本项目旨在结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式。

xiaoheshang_123的博客 330

从localtime到localtime_s:Windows与Linux时间处理函数迁移指南

本文详细解析了从`localtime`迁移到`localtime_s`和`localtime_r`的跨平台时间处理方案,解决线程安全问题。通过对比Windows与Linux的时间函数差异,提供兼容层实现和现代C++替代方案,帮助开发者避免常见陷阱,确保代码在多线程环境下的安全性。

y2z3a4b5c的博客 715

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux C时间函数踩坑实录:localtime_r的时区陷阱与多线程死锁实战解析

本文深入解析Linux C开发中localtime_r函数的时区陷阱与多线程死锁问题,通过Redis等真实案例展示潜在风险,并提供线程局部存储和Redis无锁方案等生产级解决方案,帮助开发者避免常见的时间处理错误。

rrr55的博客 194

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

linux下时间的比较,Linux下如果时间戳转换日期需要比较则采用的函数

如果时间戳转换日期需要比较则采用函数:struct tm *localtime_r(const time_t *timep, struct tm *result); 和localtime函数的区别:localtime_r可重复调用,给用户的是一个临时结果buffer,const time_t *timep参数不同,返回结果也不同;localtime不管调用多少次,给用户的是一个static结果bu...

weixin_34135138的博客 355

多线程情况下慎用localtime_r

最近有个需求,需要提升日志模块的性能。当前日志模块每秒钟处理的日志数量大概在55w左右,于是进行优化,在日志的IO线程中将sprintf剥离,提前将时间、日志等级等格式化处理。 于是这样就产生了一个问题,在IO线程中频繁的使用localtime_r来获取日期时间,在单线程中性能影响可能不大,然而我将localtime_r移动到各工作线程后,首先在windows下性能还是有55%左右的提升的,大概

sryan的专栏 1万+

localtime_r时区陷阱与C语言时间处理安全实践

在C语言编程中,时间处理是基础但易错的技术点。时间转换的核心原理是将Unix时间戳转换为可读的本地时间,这依赖于系统的时区设置。标准库函数localtime因其使用静态缓冲区而存在线程安全和可重入性问题,可能导致数据竞争甚至死锁。其线程安全版本localtime_r通过由调用者提供缓冲区解决了并发访问问题,但引入了更隐蔽的时区依赖陷阱——它依赖全局环境变量TZ和系统时区文件,在容器化部署和长期运行进程中可能因时区设置变化或缓存初始化顺序导致错误。从工程实践角度,理解时区环境变量的全局影响、掌握tzset的显

weixin_34221073的博客 390
上一篇: Makefile 编写
下一篇: ARM Linux 手写实现栈回溯
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值