考虑以下代码:

#include <stdio.h>
#include <time.h>
#include <math.h>

// Compile with gcc -lrt -lm -o test_clock test_clock.c

#define CLOCK CLOCK_MONOTONIC

int main(int argc, char** argv) {
    double temp, elapsed;
    int j;
    struct timespec requestStart, requestEnd, req;

    // Pseudo-sleep
    clock_gettime(CLOCK, &requestStart);
    temp = 0;
    for(j=0; j < 40; j++)
        temp += sin(j);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;
    printf("Elapsed: %lf us\n", elapsed);

    // Nanosleep
    clock_gettime(CLOCK, &requestStart);
    req.tv_nsec = 5000;
    req.tv_sec = 0;
    clock_nanosleep(CLOCK, 0, &req, NULL);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;

    printf("Elapsed: %lf us\n", elapsed);

}

在我的2.6.32系统上,结果是
Elapsed: 5.308000 us
Elapsed: 69.142000 us

我同意这很可能是因为nanosleep()要求内核重新安排进程。如何避免这种情况?我想保留对CPU的所有权,并在精确的时间内闲置。

最佳答案

如果您希望您的应用程序能够尽可能准确地“休眠”,请首先将您的应用程序置于实时条件下

  • 对您的程序/线程使用实时调度程序类:SCHED_FIFO或SCHED_RR
  • 提升程序/线程优先级
  • ,如果您要“ sleep ”的时间少于内核要处理的最小数量,请手动忙于等待

  • 看看http://www.drdobbs.com/184402031

    还有另一个问题:nanosleep high cpu usage?

    关于c - 怎么睡几微秒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4986818/

    10-10 03:18