【问题标题】:How does std::chrono::steady_clock::now report errors?std::chrono::steady_clock::now 如何报告错误?
【发布时间】:2013-08-07 17:26:04
【问题描述】:

这与my previous question 有关,我问std::chrono::steady_clock::now 是否应该是noexcept。现在我知道我应该想知道这个函数如何报告错误?例如,此函数在 Linux 上的常见实现使用 clock_gettime 可以返回错误。

【问题讨论】:

    标签: c++ c++11 error-handling chrono


    【解决方案1】:

    Linux clock_gettime 工具可能报告的所有错误在std::chrono::steady_clock::now() 的调试实现中都不可能出现。

    错误是:

    int clock_gettime(clockid_t clk_id, struct timespec *tp);
    
    
    EFAULT
    

    tp 指向可访问地址空间之外。

    std::chrono::steady_clock::now() 中没有用户提供的tp 出错。如果std::chrono::steady_clock::now() 将错误的tp 传递给clock_gettime,这只是steady_clock 中的一个容易修复的错误。

    EINVAL
    

    此系统不支持指定的 clk_id。

    std::chrono::steady_clock::now() 中没有用户提供的clk_id 出错。如果std::chrono::steady_clock::now() 将错误的clk_id 传递给clock_gettime,这只是steady_clock 中的一个bug,必须修复。

    请注意,steady_clock 的实现不能保证是可移植的,并且可能必须移植到任何给定平台并进行正确性测试。在某些平台上,steady_clock 可能无法以clock_gettime 的形式实现。

    EPERM
    

    clock_settime() 无权设置指示的时钟。

    不适用于steady_clock,因为没有设置时间的API。

    【讨论】:

    • 非常感谢您的回答。 Windows 通常使用 QueryPerformanceCounter 实现时钟,它可以返回文档似乎没有枚举错误情况?
    • 对不起,我不熟悉 Windows。我确实看到了这个 LWG 问题,目前处于 NAD Future 状态:cplusplus.github.io/LWG/lwg-closed.html#935
    【解决方案2】:

    它没有。 API 中没有提供错误报告。因此,Linux 实现必须要么在内部处理错误,要么不返回(例如,通过exit()std::terminate())。

    【讨论】:

    • 一个实现还可以存储最后一个成功的值,并在无法访问真实时钟的情况下将其返回。这满足了steady_clock 的单调要求。我不知道是否有任何实现真正做到这一点。
    • @GManNickG 这将属于“内部处理错误”的标题 - 但它不符合(至少在原则上)“time_point 的值以相对稳定的速率前进的要求实时。”从 20.11.7.2/1 [time.clock.steady] 开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多