linux使用clock_nanosleep睡眠
linux sleeping with clock_nanosleep
我想使用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。
相关文章:
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- boost::this_thread::sleep_for 睡眠整个程序
- 不可预测的C++睡眠/等待行为
- 超时后,线程睡眠不会继续执行
- 结构时间规范可以重复使用纳米睡眠吗?
- 这个Arduino睡眠设置的周边是什么警报功能?
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- C++睡眠时间不确定
- std::this_thread::sleep_for 睡眠时间过长
- 睡眠线程或进程的指令是否在线程/进程休眠时继续执行?
- Qthread ::更改系统时间时睡眠不正常
- 睡眠影响 std::thread 调用哪个虚拟成员函数?
- 睡眠:(睡眠或usleep)并没有将我的线程中的所有内容悬挂在Linux中,而是在Windows中悬挂吗?为什么
- 为什么输出在睡眠后没有换行符?
- 睡眠() vs _sleep() 函数
- 低功耗 ESP32 + 具有深度睡眠模式的 LoRa (TTGO LoRa32 OLED 板 V1.0).
- 将另一个线程置于睡眠状态
- 线程和睡眠
- 找不到睡眠标识符 Visual Studio 2017
- 取消精确睡眠