Dưới đây là một bài kiểm tra nhỏ mà tôi đã viết để xác minh rằng thời gian thực sự chỉ chạy chuyển tiếp trong Linux.Làm thế nào để dừng thời gian chạy ngược lại trên Linux?
#include <time.h>
#include <sys/time.h>
bool timeGoesForwardTest2()
{
timeval tv1, tv2;
double startTime = getTimeSeconds(); // my function
while (getTimeSeconds() - startTime < 5)
{
gettimeofday(&tv1, NULL);
gettimeofday(&tv2, NULL);
if (tv2.tv_usec == tv1.tv_usec &&
tv2.tv_sec == tv1.tv_sec)
{
continue; // Equal times are allowed.
}
// tv2 should be greater than tv1
if (!(tv2.tv_usec>tv1.tv_usec ||
tv2.tv_sec-1 == tv1.tv_sec))
{
printf("tv1: %d %d\n", int(tv1.tv_sec), int(tv1.tv_usec));
printf("tv2: %d %d\n", int(tv2.tv_sec), int(tv2.tv_usec));
return false;
}
}
return true;
}
Kiểm tra không thành công.
tv1: 1296011067 632550
tv2: 1296011067 632549
ummm ....
Tại sao điều này xảy ra?
Đây là thiết lập của tôi:
Linux version 2.6.35-22-generic ([email protected]) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4)) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4)
... running inside VirtualBox 3.2.12, in Windows 7.
Có thể phải thực hiện với máy ảo. Bạn đã thử làm điều này với một cài đặt Linux thực sự chưa? –
Hãy chắc chắn rằng bạn đang kiểm tra số rollover số nguyên trên tv_sec và tv_usec bất cứ khi nào thực hiện bất kỳ phép tính nào với chúng. –
Tôi nghi ngờ đó là bởi vì các cuộc gọi thời gian đi ra ngoài đến hai lõi khác nhau trên CPU của bạn và một trong số họ là trong vùng lân cận của một lỗ đen thu nhỏ.Ra khỏi nhà. Nhanh nhất có thể. Nghiêm túc! – paxdiablo