V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zuoanyx
V2EX  ›  C

请问有人知道 c++里面 time(0) 获取时间会有异常的情况吗?

  •  
  •   zuoanyx · 2021-01-29 19:17:35 +08:00 · 1990 次点击
    这是一个创建于 1425 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前做一个嵌入式设备的开发,用 C/C++,需要获取系统时间,只需要整秒数就可以了,所以就直接用这种

    time_t currtime = time(0);

    来获取时间,这个获取时间的代码是在单独的一个线程里以 while(1) 的 loop 进行的,当然也有 sleep,且不排除在其他线程中会存在 time(0) 同时获取系统时间。

    后来在打印的日志中发现一个问题,就是这个获取的秒数(每间隔 10s 获取一次)一直都很正常,但是会有出现突然某一次获取的秒数是一个明显的异常值,转换为年月日的话会差了好几年。time()这个函数应该也是线程安全的,所以目前还是没有搞清楚出现这个情况的原因,有哪位大神清楚不?求助

    11 条回复    2021-04-29 19:17:15 +08:00
    linux40
        1
    linux40  
       2021-01-29 19:33:42 +08:00
    线程安全是 POSIX 的要求。
    wevsty
        2
    wevsty  
       2021-01-29 19:36:10 +08:00
    突然出现某个数字异常,你应该检查一下是不是存在内存越界的情况。
    zuoanyx
        3
    zuoanyx  
    OP
       2021-01-29 19:57:55 +08:00
    @wevsty 内存越界之前是检查过了的,应该是 ok 的,就是这个数字异常一般表现为之前获取了 1000 次都是正常的值,类似 1611715150,突然有一次获取为 1525415140,之后又获取了 1000 此也都是正常值
    owenliang
        4
    owenliang  
       2021-01-29 20:15:11 +08:00
    嵌入式的,咱不好说。
    Huelse
        5
    Huelse  
       2021-01-29 22:20:37 +08:00
    嵌入式不太清楚,但 c++我一般会用 chrono 库,http://www.cplusplus.com/reference/chrono/
    Huelse
        6
    Huelse  
       2021-01-29 22:23:11 +08:00
    tienhua
        7
    tienhua  
       2021-01-29 22:52:54 +08:00
    分析这种问题最好给出日志和代码
    laminux29
        8
    laminux29  
       2021-01-30 00:12:55 +08:00
    还有 std::clock()在虚拟化系统里经常出问题。

    这两个问题的本质是,现在高阶 c++,时间处理方面,大多数转用 chrono 了,就算 chrono 有问题,因为用的人多,处理快,解决方案多。

    而 time()、std::clock()这种,正好相反,现在基本上很少有人用了,更新后遗留 bug 或出问题,没人解决,也就很正常了。

    IT 界这种问题很多,比如安卓,这系统一开始很烂,很多基本组件与功能都缺失。但是架不住用户多,各种缺失组件与功能,居然陆陆续续地被非官方开发者,解决地差不多了...
    js8510
        9
    js8510  
       2021-01-30 04:34:12 +08:00
    c++ clock 有两种。一种是 wall clock 一种是 chrono clock. chrono clock 是从机器起来之后开始 count 是可以准确的计算时间差的。wall clock 顾名思义,就是世界的时间。问题是一分钟不是 60s,当润分钟的时候是 61 秒。所以他是不能用来准确计算时间差的。
    zhongrs232
        10
    zhongrs232  
       2021-01-30 09:00:08 +08:00
    把业务逻辑全干掉,写一个 main 函数,里面只保留获取时间的代码,看看有没有问题,按我的经验,怀疑编译器,系统调用,标准库有问题,一般都会被打脸,另外,你有没有用到类似 ctime/gmtime 之类的函数,这些函数不是线程安全的
    zuoanyx
        11
    zuoanyx  
    OP
       2021-04-29 19:17:15 +08:00
    谢谢大家,问题已经解决,这个函数其实是没有问题的,是因为设备有另一部分的代码跑死了后看门狗把这里的时间重置了,(lll ¬ω¬)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5277 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.