定时器环绕问题

问题描述 投票:0回答:1

以下代码是否正确

Adding an event:

pushEvent(std::chrono::steady_clock::now() + dt, event_obj);

In event loop:

//...
auto now=std::chrono::steady_clock::now();
if(event.expireTime<=now)
    {
    event.fire();
    }
//...

我有点担心环绕行为,因为我知道至少有两个错误[1]和[2],这是由于时间计数器的环绕而引入的。我想到的可能是:

c++11 integer-overflow chrono
1个回答
1
投票

你可以用steady_clock::time_point检查steady_clock::time_point::max().time_since_epoch()的范围。这将返回一个chrono::duration,这是自steady_clock时代以来的最长时间。时代本身没有具体说明。不过这个:

auto time_left = steady_clock::time_point::max() - steady_clock::now();

给你时间,直到max()被击中。 time_left的确切单位可以通过以下方式进行检查:

using D = decltype(time_left);
std::cout << D::period::num << '/' << D::period::den << '\n';

在每个平台上输出:

1/1000000000

这意味着单位是纳秒。所以你可以:

std::cout << time_left.count() << "ns\n";

如果你愿意使用我的free, header-only date/time library,它会为你做那个内省,你可以这样做:

using date::operator<<;
std::cout << time_left << "\n";

对我来说这个输出:

9221890448824928278ns

这是大约292年。如果您的代码在我的平台上运行,它可能会在292年内完成。您的平台可能类似,这就是您可以测试的方式。

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