我正在编写一个线程库,在调度线程时,我需要知道它们准备了多长时间。每个线程实例都有一个timeval _timeInReady字段,当我将一个实例推送到就绪队列时,我调用此函数:
void Thread::startTiming() {
gettimeofday(&_timeInReady, NULL);
}当我想要检查当前的_timeInReady值时,我调用:
double Thread::getTimeInReady() const {
return TIME(_timeInReady.tv_sec,_timeInReady.tv_usec);
}其中#define TIME(a,b) ((a*1000000) + b)是时间,这样我就可以得到以微秒为单位的总时间。
我的问题是,由于某些原因,当我在一段时间后检查该字段时,我得到了疯狂的负值(例如-10293843)。
有什么想法吗?谢谢!
发布于 2012-04-24 23:37:00
您应该将结果作为64位无符号整数返回,因为您需要的是整数微秒结果,而不是小数秒(这意味着返回double):
unsigned long long Thread::getTimeInReady() const
{
return (unsigned long long)_timeInReady.tv_sec * 1000000ULL +
(unsigned long long)_timeInReady.tv_usec;
}你的系统可能有一个比unsigned long long更简洁的uint64_t,或者你也可以typedef它。
发布于 2012-04-25 00:06:51
在我的电脑上,所有的tv_sec、tv_usec和1000000都是有符号的32位数量。当要求持有大于2^31左右的数字时,有符号的32位值溢出。
因此,此表达式:
((x.tv_sec*1000000) + x.tv_usec)将在2^31 / 10^6秒或大约2,147秒内溢出。只要你的程序只处理短于35分钟的时间间隔,你就应该没问题。
如果你想表示>= 35分钟的值,试着用下面的代码替换你的#define:
#define TIME(a,b) ((a*1000000ull) + b)通过标准提升,此更改将导致使用unsigned long long值执行所有数学运算。
您可以(但不必)将您的double更改为uint64_t。那随你的便。
发布于 2018-04-02 17:08:30
尝试这个来获得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;https://stackoverflow.com/questions/10301106
复制相似问题