在C

时间:2016-11-25 08:37:27

标签: c linux time

所以我试图让无限时循环的每次迭代都需要nsec_ival_tspec.tv_nsec纳秒。我这样做是:

while(!done){
    clock_gettime(CLOCK_MONOTONIC, &start_loop_time);

    ...

    clock_gettime(CLOCK_MONOTONIC, &end_loop_time);
    timespec_sum(&start_loop_time, &nsec_ival_tspec, &exp_end);
    timespec_diff(&end_loop_time, &exp_end, &diff_tspec);
    if(diff_tspec.tv_sec >=0 && diff_tspec.tv_nsec>=0){
        nanosleep(&diff_tspec, NULL);
    }

其中timespec_sum / diff是void-output函数,其第三个参数被结果覆盖。他们按预期工作,所以不用担心。

由于某种原因,这个方案超过六位数纳秒。

0004.139  Expected iteration time: 2000000 nsec
0004.142  Mean iteration time:     2188123 nsec

添加了一项检查,看看nanosleep是否睡过头了。

    clock_gettime(CLOCK_MONOTONIC, &tmpclock);
    printf("Expected time after sleep: %ld\n", tmpclock.tv_nsec + diff_tspec.tv_nsec);
    if(diff_tspec.tv_sec >=0 && diff_tspec.tv_nsec>0){
        nanosleep(&diff_tspec, &error_spec);
    }
    clock_gettime(CLOCK_MONOTONIC, &tmpclock);
    printf("Real time after sleep:     %ld\n", tmpclock.tv_nsec);
是的,确实如此。大约10 ^ 5纳秒。我在这里做了一些明显不对的事吗?

0 个答案:

没有答案