所以我试图让无限时循环的每次迭代都需要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纳秒。我在这里做了一些明显不对的事吗?