首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gettimeofday返回负值

gettimeofday返回负值
EN

Stack Overflow用户
提问于 2012-04-24 23:29:06
回答 3查看 5.1K关注 0票数 3

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

代码语言:javascript
复制
void Thread::startTiming() {
    gettimeofday(&_timeInReady, NULL);
}

当我想要检查当前的_timeInReady值时,我调用:

代码语言:javascript
复制
double Thread::getTimeInReady() const {
    return TIME(_timeInReady.tv_sec,_timeInReady.tv_usec);
}

其中#define TIME(a,b) ((a*1000000) + b)是时间,这样我就可以得到以微秒为单位的总时间。

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

有什么想法吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-24 23:37:00

您应该将结果作为64位无符号整数返回,因为您需要的是整数微秒结果,而不是小数秒(这意味着返回double):

代码语言:javascript
复制
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它。

票数 5
EN

Stack Overflow用户

发布于 2012-04-25 00:06:51

在我的电脑上,所有的tv_sectv_usec1000000都是有符号的32位数量。当要求持有大于2^31左右的数字时,有符号的32位值溢出。

因此,此表达式:

代码语言:javascript
复制
((x.tv_sec*1000000) + x.tv_usec)

将在2^31 / 10^6秒或大约2,147秒内溢出。只要你的程序只处理短于35分钟的时间间隔,你就应该没问题。

如果你想表示>= 35分钟的值,试着用下面的代码替换你的#define

代码语言:javascript
复制
#define TIME(a,b) ((a*1000000ull) + b)

通过标准提升,此更改将导致使用unsigned long long值执行所有数学运算。

您可以(但不必)将您的double更改为uint64_t。那随你的便。

票数 1
EN

Stack Overflow用户

发布于 2018-04-02 17:08:30

尝试这个来获得32位系统的时间:-

代码语言:javascript
复制
struct timeval time;
gettimeofday(&time, NULL);
unsigned long long secTime = ((unsigned long long)time.tv_sec) * 1000 + ((unsigned long long)(time.tv_usec))/1000;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10301106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档