На двете системи, които тествах (32-битов Ubuntu 12.04 сървър и 64-битов Ubuntu 13.10 VM), секундите от епохата са дадени от time() може да се различава от gettimeofday().
По-конкретно, въпреки че извиквам time()
след извикване на gettimeofday()
, стойността, върната от time()
, понякога е по-малка от стойността tv_sec
, върната от gettimeofday()
.
Това очевидно се случва точно след като часовникът се прехвърли на нова секунда.
Това причини грешки в някои от моя код, които очакваха time() и gettimeofday() секундите да бъдат взаимозаменяеми.
Примерен код, демонстриращ този проблем:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
time_t start = time(NULL);
int same = 0;
int different = 0;
int max_usec = 0;
while (1) {
time_t t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = time(NULL);
if (t < tv.tv_sec) {
different++;
if (tv.tv_usec > max_usec) {
max_usec = tv.tv_usec;
}
} else {
same++;
}
if (t > start + 5) {
break;
}
}
printf("Same: %i\n", same);
printf("Different: %i\n", different);
printf("Largest difference seen at %i\n", max_usec);
}
Обърнете внимание, че извиквам time() секунда и се оплаквам само ако стойността му е по-малка от тази на gettimeofday().
Примерен резултат:
Same: 33282836
Different: 177076
Largest difference seen at 5844
Т.е., двете стойности са били еднакви 33 милиона пъти, те са били различни 177k пъти и винаги са били различни в рамките на 5844 микросекунди от нова секунда.
Това известен проблем ли е? Какво причинява това?
time()
се актуализира доста последователно между 7000 и 7003 микросекунди след актуализирането на стойносттаgettimeofday()
. В моята система x86_64 Debian (работеща с по-старо ядро) не показва несъответствия. - person Keith Thompson   schedule 07.04.2014