是否确保2个连续的std :: chrono :: steady_clock :: now()不相等?

问题描述 投票:4回答:3

我希望在同一运行线程中选择的时间点永远不相等。这是因为我使用时间点来区分不同的计算结果。

伪代码:

StampedResult fn() {
  auto result = Calculations();
  auto time_stamp = std::chrono::steady_clock::now();
  return {time_stamp, result);
}

现在,如果Calculations()总是很复杂,那将自动解决。但有时Calculations()可能会立即返回。

所以,我想我应该检查对steady_clock::now()的2个连续调用是否可以返回相同的值,如下所示:

https://onlinegdb.com/BkiDAZRe8

onlinegdb.com和笔记本电脑Intel® Core™ i7-8750H CPU @ 2.20GHz上,我从未得到相同的返回值。但是给定steady_clock的纳秒精度,其他超高频处理器是否可以实际返回相同的值?

c++ c++14 std clock chrono
3个回答
5
投票

是否确保2个连续的std :: chrono :: steady_clock :: now()不相等?

标准不保证。引用最新草稿:

[time.clock.steady]

steady_­clock类的对象表示这样的时钟,对于这些时钟,time_­point的值不会随着物理时间的增长而减少,并且time_­point的值相对于实时以稳定的速率增长。也就是说,时钟可能无法调整。

保持不变满足“永不减少”的要求。

时钟具有有限的粒度,并且如果粒度小于对now的调用频率,则从理论上讲两个调用之间的值保持相同是可行的。对于相同的值再次出现,呼叫的复杂性是实际的限制,但这是偶然的。


如果您希望避免重复值,那么可以通过存储最后一个时间戳来切实可行地避免这种可能性。如果新的一个等于或小于旧的,则将新的一个微调一个度量单位。如果存在三个相等的值,则“较少”部分成为可能,因此第二个值被推到第三个值之后。


2
投票

steady_clock必须不向后移动,并且需要以规则的间隔向前移动。而已。甚至不需要具有纳秒级的精度(或时钟的实际精度以匹配其时间点的精度)。

对于您正在做的事情,使自己的内部计数器在每次计算时都会增加,这是一个更好的选择。


1
投票

没有无法保证两个调用不会返回相同的值。

如果您设法在其分辨率内多次查询时钟,则会多次获得相同的结果。发生这种情况的可能性取决于您查询的时钟,但总是一种可能性。

简而言之;您cannot使用时间戳作为唯一标识符。如果未重新使用线程ID,您可能可以使用“时间戳+ thread_id”。最好先按时间戳排序,然后再按创建时分配给每个线程的单调递增ID排序。这样可以保证唯一性并建立固定的排序顺序。

© www.soinside.com 2019 - 2024. All rights reserved.