linux与clock_nanosleep一起睡觉

时间:2013-12-02 15:55:57

标签: c++ sleep clock

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

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

clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);

5 个答案:

答案 0 :(得分:20)

你的截止日期电视不是绝对的时间。要形成绝对时间,请使用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);

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

答案 1 :(得分:4)

  

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

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

clock_nanosleep(CLOCK_REALTIME, 0, &deadline, NULL);

从现在起指定一微秒。

答案 2 :(得分:2)

@ryanyuyu

示例代码::

void mysleep_ms(int milisec)
{
    struct timespec res;
    res.tv_sec = milisec/1000;
    res.tv_nsec = (milisec*1000000) % 1000000000;
    clock_nanosleep(CLOCK_MONOTONIC, 0, &res, NULL);
}

这是基于单调时钟的睡眠功能。 请参考。

答案 3 :(得分:0)

将程序暂停一微秒 (1us) 的最精确方法是忙等待,sleep 机制(nanosleep 或 clock_nanosleep)将涉及任务调度和上下文切换,其延迟大于 1us。< /p>

参考:

delays - Information on the various kernel delay / sleep mechanisms

答案 4 :(得分:-1)

我推荐第二种使用睡眠功能。 因为,大多数系统功能都使用CLOCK_REALTIME,但是,它有一些严重的问题, 如果系统时间和日期已更改。 在大多数情况下,我推荐相对睡眠方式,最好的选择是使用clock_monotonic。