C++ gettimeofday返回一个负值

C++ gettimeofday返回一个负值,c++,gettimeofday,C++,Gettimeofday,我正在编写一个线程库,在安排线程时,我需要知道它们已经准备好了多长时间。每个线程实例都有一个timeval\u timeInReady字段,当我将实例推送到就绪队列时,我调用此函数: void Thread::startTiming() { gettimeofday(&_timeInReady, NULL); } 当我想检查当前的\u timeInReady值时,我调用: double Thread::getTimeInReady() const { return TI

我正在编写一个线程库,在安排线程时,我需要知道它们已经准备好了多长时间。每个线程实例都有一个
timeval\u timeInReady
字段,当我将实例推送到就绪队列时,我调用此函数:

void Thread::startTiming() {
    gettimeofday(&_timeInReady, NULL);
}
当我想检查当前的
\u timeInReady
值时,我调用:

double Thread::getTimeInReady() const {
    return TIME(_timeInReady.tv_sec,_timeInReady.tv_usec);
}
其中时间是
#定义时间(a,b)((a*1000000)+b)
,以微秒为单位计算总时间

我的问题是,出于某种原因,当我在一段时间后检查该字段时,会得到疯狂的负值(例如-10293843)


有什么想法吗?谢谢

您应该以64位无符号整数的形式返回结果,因为您想要的是整数微秒的结果,而不是小数秒的结果(这意味着返回
双精度
):


您的系统可能有
uint64\u t
,它比
无符号长
更简洁,或者您可以
typedef
它。

在我的计算机上,所有
tv\u sec
tv\u usec
1000000
都是有符号的32位量。当要求保留大于2^31左右的数字时,有符号32位值溢出

因此,此表达式:

((x.tv_sec*1000000) + x.tv_usec)
将在
2^31/10^6
秒或大约2147秒后溢出。只要你的程序只处理少于35分钟的时间间隔,你就可以了

如果要表示大于等于35分钟的值,请尝试用以下内容替换
#define

#define TIME(a,b) ((a*1000000ull) + b)
通过标准升级,此更改将使用
无符号long
值执行所有数学运算


您可以(但无需)将
double
更改为
uint64\t
。这取决于你

为32位系统争取时间,请尝试以下方法:-

struct timeval time;
gettimeofday(&time, NULL);
unsigned long long secTime = ((unsigned long long)time.tv_sec) * 1000 + ((unsigned long long)(time.tv_usec))/1000;

确切地说,你观察到什么使你认为你有负数?如果是打印报表,请出示。如果是调试器检查,请告诉我们更多信息。
struct timeval time;
gettimeofday(&time, NULL);
unsigned long long secTime = ((unsigned long long)time.tv_sec) * 1000 + ((unsigned long long)(time.tv_usec))/1000;