c++ переполняется clock_gettime()?

При использовании следующего примера кода значение tv_nsec, я полагаю, зацикливается, потому что оно onlyи long;

#include <iostream>
using namespace std;
#include <time.h>

int main(int argc, char *argv[]) {
  timespec time1, time2;
  timespec timens = {0};
  timens.tv_sec = 1;

  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
  nanosleep(&timens, (struct timespec *)NULL);
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);

  cout << time1.tv_nsec << " : " << time2.tv_nsec << endl;
  cout << (time2.tv_nsec-time1.tv_nsec) << endl;
  return 0;
}

$ ./microtime 
2754095 : 2766801
12706

Разница между начальным и конечным временем составляет 12706 нс (12,7 мкс), 12 мкс не требовалось, чтобы заснуть на 1 секунду, я разумнов этом уверен! , имеет ли tv_nsec цикл? Предполагая, что это singed long, чтобы дать меньший диапазон положительных значений (от 0 до 2147483647) вместо unsigned long(от 0 до 4294967295), 2147483647 наносекунд по-прежнему чуть больше 2 полных секунд!

Если я изменю код на следующий, я все равно получу кажущийся неверным вывод:

timens.tv_sec = 0;
timens.tv_nsec = 100000;

$ ./microtime
2743552 : 2754327
10775

Продолжительность сна была установлена ​​на 100 000 нс, но, согласно этому выводу, программа спала на 10 000 нс. Я знаю, что это небольшой промежуток времени, но я пытаюсь показать здесь, что будь то долгое время, например, 1 секунда, или короткое время, например 100 мкс, кажется, что здесь нет точности или где-либо еще. между этими значениями. Я что-то делаю не так, я как-то неправильно это реализовал? Почему я не могу получить фактическую продолжительность события между вызовами clock_gettime()?

Большое спасибо за ваше время.

Обновление

@Oli; Я могу проверить ваше предложение с помощью следующего кода, но он не работает:

int main(int argc, char *argv[]) {
  timespec time1, time2;
  timespec timens = {0};
  timens.tv_sec = 1;
  timens.tv_nsec = 0;

  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
  nanosleep(&timens, (struct timespec *)NULL);
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);

  cout <<time1.tv_sec<<"s:"<<time1.tv_nsec<<"ns : "<<
         time2.tv_sec<<"s:"<<time2.tv_nsec<<"ns"<<endl;
  cout <<(time2.tv_nsec-time1.tv_nsec)<<endl;
  return 0;
}

$ ./microtime
0s:2801478ns : 0s:2813732ns
12254
0
задан jwbensley 13 May 2012 в 14:46
поделиться