linux sleeping with clock_nanosleep

前端 未结 4 1039
自闭症患者
自闭症患者 2021-02-09 13:10

I want to use clock_nanosleep for waiting of 1 microsec.. As far as I understand, I have to give an absolute time as input. Is the following code okay in this case?

<         


        
相关标签:
4条回答
  • 2021-02-09 13:38

    Your deadline tv is not an absolute time. To form an absolute time, get the current time with clock_gettime() (http://linux.die.net/man/3/clock_gettime), then add your sleep interval.

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

    Note that I'm using CLOCK_MONOTONIC instead of CLOCK_REALTIME. You don't actually care what time it is, you just want the clock to be consistent.

    0 讨论(0)
  • 2021-02-09 13:39

    I recommend 2nd way of use sleep function. because , most of system function uses CLOCK_REALTIME, But, It has some serious problem, If system time and date has changed. In most case I recommend relative sleep way , best choice is using clock_monotonic.

    0 讨论(0)
  • 2021-02-09 13:44

    As far as I understand, I have to give an absolute time as input.

    No, the flags argument allows you to choose relative or absolute time. You want

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

    to specify one microsecond from now.

    0 讨论(0)
  • 2021-02-09 13:51

    @ryanyuyu

    sample code::

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

    this is monotonic clock based sleep function. please refer it.

    0 讨论(0)
提交回复
热议问题