gpt4 book ai didi

c - 如何查看系统是否支持 "Monotonic Clock"?

转载 作者:IT王子 更新时间:2023-10-29 01:03:13 29 4
gpt4 key购买 nike

我需要在代码中处理超时情况,如果系统支持单调时钟,我想使用 clock_gettime(CLOCK_MONOTONIC)

#ifdef CLOCK_MONOTONIC
clock_gettime(CLOCK_MONOTONIC, & spec);
#else
clock_gettime(CLOCK_REALTIME, & spec);
#endif

我不确定这是否足够。也就是说,有没有可能系统定义的CLOCK_MONOTONIC并不是真正支持monotonic clock?或者检查是否支持单调时钟的可靠方法是什么?

最佳答案

根据 POSIX 的规定,您实际上可能需要运行时测试,即使常量 CLOCK_MONOTONIC 也是如此。被定义为。处理这个问题的官方方法是使用 _POSIX_MONOTONIC_CLOCK “功能测试宏”,但这些宏具有非常复杂的语义:引用 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html ,

If a symbolic constant is not defined or is defined with the value -1, the option is not supported for compilation. If it is defined with a value greater than zero, the option shall always be supported when the application is executed. If it is defined with the value zero, the option shall be supported for compilation and might or might not be supported at runtime.

将这种三向区别转化为代码会给你这样的东西:

#if !defined _POSIX_MONOTONIC_CLOCK || _POSIX_MONOTONIC_CLOCK < 0
clock_gettime(CLOCK_REALTIME, &spec);
#elif _POSIX_MONOTONIC_CLOCK > 0
clock_gettime(CLOCK_MONOTONIC, &spec);
#else
if (clock_gettime(CLOCK_MONOTONIC, &spec))
clock_gettime(CLOCK_REALTIME, &spec));
#endif

但是如果你总是在定义了 CLOCK_MONOTONIC 本身时进行运行时测试,它会更简单且更易读:

#ifdef CLOCK_MONOTONIC
if (clock_gettime(CLOCK_MONOTONIC, &spec))
#endif
clock_gettime(CLOCK_REALTIME, &spec);

这会在当前支持 CLOCK_MONOTONIC 的操作系统上增加一些微不足道的代码大小,但在我看来,可读性的好处是值得的。

使用 CLOCK_MONOTONIC 也有很强的论据无条件地;您更有可能找到不支持 clock_gettime 的操作系统完全没有(例如,据我所知,MacOS X 仍然没有)比有 clock_gettime 的操作系统但不是 CLOCK_MONOTONIC .

关于c - 如何查看系统是否支持 "Monotonic Clock"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50245373/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com