linux使用clock_nanosleep睡眠

linux sleeping with clock_nanosleep

本文关键字:nanosleep 睡眠 clock 使用 linux      更新时间:2023-10-16

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

deadline.tv_sec = 0;
deadline.tv_nsec = 1000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);

您的截止日期电视不是绝对的时间。要形成绝对时间,请使用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。实际上,你并不在乎现在是什么时间,你只希望时钟保持一致。

据我所知,我必须给出一个绝对的时间作为输入。

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

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

从现在起指定一微秒。

@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);
}

这是基于单调时钟的睡眠函数。请参阅。

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

参考:

delays-有关各种内核延迟/睡眠机制的信息

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