请问有人知道 c++里面 time(0) 获取时间会有异常的情况吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zuoanyx
V2EX    C

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

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

    之前做一个嵌入式设备的开发,用 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     Solana     978 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 19:04 PVG 03:04 LAX 12:04 JFK 15:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86