我想使用clock_nanosleep等待1微秒。据我所知,我必须给出绝对时间作为输入。在这种情况下,以下代码是否可以?
deadline.tv_sec = 0;
deadline.tv_nsec = 1000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);
答案 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。