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;