【问题标题】:Why is clock_nanosleep preferred over nanosleep to create sleep times in C?为什么 clock_nanosleep 比 nanosleep 更喜欢在 C 中创建睡眠时间?
【发布时间】:2011-12-09 08:17:58
【问题描述】:

这两个功能哪个更好

#include <time.h>
int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp);

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

【问题讨论】:

  • 定义“好”。便携、高效、知名、易懂、准确,什么什么什么?
  • 您阅读手册页了吗? linux.die.net/man/3/clock_nanosleep
  • @SanJacinto 没有人阅读手册页。就像我问你“你读过 Facebook 服务条款了吗?”或者一个机械师问你“你读过用户手册吗?”当你不知道为什么你的远光灯不能工作时 =P

标签: c linux linux-kernel system-calls


【解决方案1】:

clock_nanosleep 相对于nanosleep 的优势在于:

  1. 您可以指定睡眠的绝对时间直到,而不是睡眠的间隔。这对实时(挂钟)时钟产生了影响,可以由管理员或ntpd 等重置。使用nanosleep 并预先计算睡眠间隔以达到给定的绝对时间,您将无法唤醒如果时钟被重置并且所需时间“提前”到达。此外,使用间隔时间进行调度存在竞争条件:如果您计算要睡眠的间隔,但在调用 nanosleep 之前被抢占并且暂时没有再次安排,那么您将再次睡眠太久。
  2. 您可以在除实时时钟之外的计时器上睡眠。最有用的通常是单调时钟(它不能被重置并且随着实际时间的进展而单调增加),但也有其他有趣的应用程序,例如在多线程进程中让一个线程在进程的 cpu 时钟上休眠(因此它会在进程使用给定的 cpu 时间后唤醒)。

【讨论】:

  • 只是想添加注释以防止混淆... Linux 中的 nanosleep() 使用 CLOCK_MONOTONIC 时钟。所以如果你想在Linux中使用CLOCK_MONOTONIC以外的时钟,那就需要clock_nanosleep()。
  • @It'sPete:相对时间睡眠不都一样吗?
【解决方案2】:

在我的系统上,man 2 clock_nanosleep 解释了这两个函数之间的区别:

与 nanosleep(2) 一样,clock_nanosleep() 允许调用者休眠一段时间 以纳秒精度指定的时间间隔。它的不同之处在于允许 调用者选择睡眠间隔所针对的时钟 被测量,并在允许睡眠间隔被指定为 绝对值或相对值。 clock_id 参数 [...] 可以具有以下值之一: CLOCK_REALTIME 可设置的系统范围的实时时钟。 CLOCK_MONOTONIC 一个不可设置的单调递增时钟, 测量从过去某个未指定时间点开始的时间 系统启动后不会改变。 CLOCK_PROCESS_CPUTIME_ID 一个可设置的每进程时钟,用于测量 CPU 时间 由进程中的所有线程消耗。

【讨论】:

  • 谢谢...我正在使用 posix 精确睡眠标准库函数进行睡眠,但它似乎返回得太快了。请检查此代码并提供有关修复函数以正确休眠正确时间的方法的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2010-12-05
  • 2011-03-07
  • 2015-12-25
相关资源
最近更新 更多