localtime()在多线程中使用的少的时候是不会出错的

现localtime和ctime等函数在linux中的返回值均存放在一个静态区中,即TLS变量。如果在多线程程序中比较频繁的调用此函数,则可能出现内容错乱的情况。

//曾在某平台下多线程中使用localtime库函数。可恶的是,每当程序运行
//一段时间后,都要出现内存泄露。查了数个夜晚为什么,无从断定。
//只能狠狠心,自己写了个localtimes,功能与localtime库函数相同。
//有了它以后,我就不再因内存泄露而烦恼了。
//要知道“内存泄露”是程序员大的一大耻辱。

//这个localtimes在多线程下已经运行了3年,还没发生问题,放心使用。

//一年中每个月的天数,非闰年
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/*++------------------------------------------------------------------------

Function:
              localtimes

Modification History

Jurassic           2002.1    Created.              
--------------------------------------------------------------------------*/
void
__stdcall
localtimes(
   time_t time,
   long timezone,
           struct tm *tm_time
)
{
    unsigned  __int32 n32_Pass4year;
              __int32 n32_hpery;

//计算时差
    time=time-timezone;
    
    if(time < 0)
    {
       time = 0;
    }
    //取秒时间
    tm_time->tm_sec=(int)(time % 60);
    time /= 60;
    //取分钟时间
    tm_time->tm_min=(int)(time % 60);
    time /= 60;
    //取过去多少个四年,每四年有 1461*24 小时
    n32_Pass4year=((unsigned int)time / (1461L * 24L));
    //计算年份
    tm_time->tm_year=(n32_Pass4year << 2)+70;
    //四年中剩下的小时数
    time %= 1461L * 24L;
    //校正闰年影响的年份,计算一年中剩下的小时数
    for (;;)
    {
        //一年的小时数
        n32_hpery = 365 * 24;
        //判断闰年
        if ((tm_time->tm_year & 3) == 0)
{
            //是闰年,一年则多24小时,即一天
            n32_hpery += 24;
}
        if (time < n32_hpery)
{
            break;
}
        tm_time->tm_year++;
        time -= n32_hpery;
    }
    //小时数
    tm_time->tm_hour=(int)(time % 24);
    //一年中剩下的天数
    time /= 24;
    //假定为闰年
    time++;
    //校正润年的误差,计算月份,日期
    if ((tm_time->tm_year & 3) == 0)
    {
if (time > 60)
{
time--;
}
else
{
if (time == 60)
{
tm_time->tm_mon = 1;
tm_time->tm_mday = 29;
return ;
}
}
    }
    //计算月日
    for (tm_time->tm_mon = 0; Days[tm_time->tm_mon] < time;tm_time->tm_mon++)
    {
          time -= Days[tm_time->tm_mon];
    }

tm_time->tm_mday = (int)(time);

return;

}

转载于:https://www.cnblogs.com/aixingfou/archive/2011/07/13/2105672.html

自己写 localtime 函数(含完整注释,代码)转载相关推荐

  1. springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码)

    springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码) 一.整合sharding-jdbc 关于springboot整合sharding ...

  2. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  3. (转载)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解 ...

  4. 基于Q-learning的无人机三维路径规划(含完整C++代码)

    目录 1.实验目标 2.相关原理 3.实验过程 3.1基于Q-learning的三维模型创建 3.2无人机类.环境类和障碍物类的建立 3.3继承和多态的实现 3.4训练 3.5测试 4.完整代码 ma ...

  5. 冰河连夜复现了Log4j最新史诗级重大漏洞,含视频和完整案例代码,全网最全,赶快收藏吧

    大家好,我是冰河~~ 周末与一些小伙伴交流的过程当中,发现一些小伙伴公司的项目中使用的Log4j版本还是2.14.0,我一听就有点震惊了:你们还在使用Log4j的2.14.0版本,这个版本存在重大漏洞 ...

  6. (十二) 完整注释的代码摘录

    title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...

  7. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  8. 看看函数名和注释,AI就能自动生成代码,程序员:这不真实,我要失业

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心  参与:张倩.Racoon X.Jamin 你 ...

  9. python绘制条形图用什么函数_Python绘制正余弦函数图像完整代码

    通过python绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样.通过这个过程来学习如何进行对图表的一些元素的进行调整. 01. 简单绘图 mat ...

最新文章

  1. 短信猫GSM Modem
  2. gtest简介及简单使用
  3. 用Python轻松搞定Excel中的20个常用操作
  4. 模拟信号可以传输声音和图像,那么文字呢--信息论系列
  5. python开发需要掌握哪些知识-Python的8个基础知识点,新手必须背下来!
  6. 小技巧—设置IIS禁止网站放下载电影文件
  7. python date time
  8. 清北学堂(2019 4 28 ) part 1
  9. nginx文件系统大小_详解Nginx系列
  10. Java通过反射机制修改类中的私有属性的值
  11. php 高德地图创建标注,高德地图 JS API的覆盖物—编辑矢量图形
  12. 时间选择插件jquery.timepickr
  13. PHP许愿墙的经济可行性,深入PHP许愿墙模块功能分析
  14. java常用英语词汇翻译_JAVA 一些常用的英文及翻译
  15. makefile编写规则
  16. Bus Hound使用心得#抓包工具#协议抓取
  17. Cocos2d-lua中lua代码加密成luac
  18. 为N台linux服务器传输大文件
  19. JSON在JS中的应用
  20. 保龄球计分程序java_保龄球计分程序

热门文章

  1. python学习记录(三)
  2. 【codeforces 766E】Mahmoud and a xor trip
  3. C# WINFORM ListView用法详解(转)
  4. iOS之富文本(二)
  5. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...
  6. 一条进程的栈区、堆区、数据区和代码区在内存中的映射
  7. HDOJ 1175 连连看 DFS
  8. java B2B2C springmvc mybatis电子商务平台源码-Spring Cloud Security
  9. Single-Shot Object Detection with Enriched Semantics
  10. 关键词 - SEO中最重要的项目