linux与clock_nanosleep一起睡觉

Avb*_*Avb 4 c++ sleep clock

我想使用clock_nanosleep等待1微秒.据我了解,我必须给出绝对时间作为输入.在这种情况下,以下代码是否可以?

deadline.tv_sec = 0;
deadline.tv_nsec = 1000;

clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 21

你的截止日期电视不是一个绝对的时间.要形成绝对时间,请使用clock_gettime()(http://linux.die.net/man/3/clock_gettime)获取当前时间 ,然后添加睡眠间隔.

struct timespec deadline;
clock_gettime(CLOCK_MONOTONIC, &deadline);

// Add the time you want to sleep
deadline.tv_nsec += 1000;

// Normalize the time to account for the second boundary
if(deadline.tv_nsec >= 1000000000) {
    deadline.tv_nsec -= 1000000000;
    deadline.tv_sec++;
}
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL);
Run Code Online (Sandbox Code Playgroud)

请注意,我使用CLOCK_MONOTONIC而不是CLOCK_REALTIME.你实际上并不关心它是什么时候,你只是想让时钟保持一致.

  • @MikeSeymour,我需要这个,因为我正在设计一个定期运行的线程来测试调度算法.所以,我不能使用相对时间,因为这将累积错误.所以这可能是一个这样的应用程序. (3认同)
  • @DAG 只有当您添加超过 1 秒时才会发生这种情况。要在上述示例中执行此操作,请将整秒添加到 tv_sec 字段,并将小数秒添加到 tv_nsec 字段(如上所述)。那么上面的归一化就可以正常工作了。如果您使用 nanos 来表示整整几秒,请注意溢出……在某些实现中,tv_nsec 将在 2 秒多一点时溢出。 (2认同)

Mik*_*our 8

据我了解,我必须给出一个绝对时间作为输入。

不,该flags参数允许您选择相对时间或绝对时间。你要

clock_nanosleep(CLOCK_REALTIME, 0, &deadline, NULL);
Run Code Online (Sandbox Code Playgroud)

从现在开始指定一微秒。