之前做一个嵌入式设备的开发,用 C/C++,需要获取系统时间,只需要整秒数就可以了,所以就直接用这种
time_t currtime = time(0);
来获取时间,这个获取时间的代码是在单独的一个线程里以 while(1) 的 loop 进行的,当然也有 sleep,且不排除在其他线程中会存在 time(0) 同时获取系统时间。
后来在打印的日志中发现一个问题,就是这个获取的秒数(每间隔 10s 获取一次)一直都很正常,但是会有出现突然某一次获取的秒数是一个明显的异常值,转换为年月日的话会差了好几年。time()这个函数应该也是线程安全的,所以目前还是没有搞清楚出现这个情况的原因,有哪位大神清楚不?求助
1
linux40 2021-01-29 19:33:42 +08:00
线程安全是 POSIX 的要求。
|
2
wevsty 2021-01-29 19:36:10 +08:00
突然出现某个数字异常,你应该检查一下是不是存在内存越界的情况。
|
3
zuoanyx OP @wevsty 内存越界之前是检查过了的,应该是 ok 的,就是这个数字异常一般表现为之前获取了 1000 次都是正常的值,类似 1611715150,突然有一次获取为 1525415140,之后又获取了 1000 此也都是正常值
|
4
owenliang 2021-01-29 20:15:11 +08:00
嵌入式的,咱不好说。
|
5
Huelse 2021-01-29 22:20:37 +08:00
嵌入式不太清楚,但 c++我一般会用 chrono 库,http://www.cplusplus.com/reference/chrono/
|
6
Huelse 2021-01-29 22:23:11 +08:00
|
7
tienhua 2021-01-29 22:52:54 +08:00
分析这种问题最好给出日志和代码
|
8
laminux29 2021-01-30 00:12:55 +08:00
还有 std::clock()在虚拟化系统里经常出问题。
这两个问题的本质是,现在高阶 c++,时间处理方面,大多数转用 chrono 了,就算 chrono 有问题,因为用的人多,处理快,解决方案多。 而 time()、std::clock()这种,正好相反,现在基本上很少有人用了,更新后遗留 bug 或出问题,没人解决,也就很正常了。 IT 界这种问题很多,比如安卓,这系统一开始很烂,很多基本组件与功能都缺失。但是架不住用户多,各种缺失组件与功能,居然陆陆续续地被非官方开发者,解决地差不多了... |
9
js8510 2021-01-30 04:34:12 +08:00
c++ clock 有两种。一种是 wall clock 一种是 chrono clock. chrono clock 是从机器起来之后开始 count 是可以准确的计算时间差的。wall clock 顾名思义,就是世界的时间。问题是一分钟不是 60s,当润分钟的时候是 61 秒。所以他是不能用来准确计算时间差的。
|
10
zhongrs232 2021-01-30 09:00:08 +08:00
把业务逻辑全干掉,写一个 main 函数,里面只保留获取时间的代码,看看有没有问题,按我的经验,怀疑编译器,系统调用,标准库有问题,一般都会被打脸,另外,你有没有用到类似 ctime/gmtime 之类的函数,这些函数不是线程安全的
|
11
zuoanyx OP 谢谢大家,问题已经解决,这个函数其实是没有问题的,是因为设备有另一部分的代码跑死了后看门狗把这里的时间重置了,(lll ¬ω¬)
|