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

Is it ensured that 2 sequential std::chrono::steady_clock::now() will not be equal?

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

伪代码:

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

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

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

https://onlinegdb.com/BkiDAZRe8

onlinegdb.com 和我的笔记本电脑 Intel® Core™ i7-8750H CPU @ 2.20GHz 上,我从来没有得到相同的值 returned。但是,在给定 steady_clock 的纳秒精度的情况下,其他一些超高频处理器实际上 return 可以得到相同的值吗?

Is it ensured that 2 sequential std::chrono::steady_clock::now() will not be equal?

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

[time.clock.steady]

Objects of class steady_­clock represent clocks for which values of time_­point never decrease as physical time advances and for which values of time_­point advance at a steady rate relative to real time. That is, the clock may not be adjusted.

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

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


如果你想避免重复值,那么你可以通过存储最后的时间戳来防止这种可能性。如果新的等于或小于旧的,则将新的推高一个测量单位。如果存在三个相等的值,则“较少”部分成为可能,因此第二个被推到第三个之外。

steady_clock要求不后退,要求每隔一定时间向前推进。而已。它甚至不需要纳秒精度(或者时钟的实际精度与其时间点的精度相匹配)。

对于您正在做的事情,让您自己的内部计数器在您每次进行计算时都会上升是一个更好的选择。

没有。无法保证两次调用不会 return 相同的值。

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

简而言之;您不能使用时间戳作为唯一标识符。如果不重复使用线程 ID,您可能 可以使用 "timestamp + thread_id"。也许最好先对时间戳进行排序,然后再对创建时分配给每个线程的单调递增 id 进行排序。这将保证唯一性并建立固定的排序顺序。