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

2021-01-29 19:17:35 +08:00
 zuoanyx

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

time_t currtime = time(0);

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

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

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

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

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

IT 界这种问题很多,比如安卓,这系统一开始很烂,很多基本组件与功能都缺失。但是架不住用户多,各种缺失组件与功能,居然陆陆续续地被非官方开发者,解决地差不多了...
js8510
2021-01-30 04:34:12 +08:00
c++ clock 有两种。一种是 wall clock 一种是 chrono clock. chrono clock 是从机器起来之后开始 count 是可以准确的计算时间差的。wall clock 顾名思义,就是世界的时间。问题是一分钟不是 60s,当润分钟的时候是 61 秒。所以他是不能用来准确计算时间差的。
zhongrs232
2021-01-30 09:00:08 +08:00
把业务逻辑全干掉,写一个 main 函数,里面只保留获取时间的代码,看看有没有问题,按我的经验,怀疑编译器,系统调用,标准库有问题,一般都会被打脸,另外,你有没有用到类似 ctime/gmtime 之类的函数,这些函数不是线程安全的
zuoanyx
2021-04-29 19:17:15 +08:00
谢谢大家,问题已经解决,这个函数其实是没有问题的,是因为设备有另一部分的代码跑死了后看门狗把这里的时间重置了,(lll ¬ω¬)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/749672

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX