繁体   English   中英

是否确保 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()可能会立即返回。

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

https://onlinegdb.com/BkiDAZRe8

onlinegdb.com和我的笔记本电脑Intel® Core™ i7-8750H CPU @ 2.20GHz我从未得到相同的值。 但是考虑到steady_clock的纳秒精度,其他一些超高频处理器真的能返回相同的值吗?

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

标准不保证。 引自最新草案:

[时间.时钟.稳定]

stable_clock 类的对象表示 time_point 的值永远不会随着物理时间的前进而减少的时钟,并且 time_point 的值相对于实时以稳定的速率前进。 也就是说,时钟可能不会被调整。

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

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


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

steady_clock要求不倒退,要求每隔一定时间向前推进。 就是这样。 甚至不需要具有纳秒精度(或时钟的实际精度以匹配其时间点的精度)。

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

不可以。不能保证两次调用不会返回相同的值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM