【问题标题】:gettimeofday returns a negative valuegettimeofday 返回一个负值
【发布时间】:2012-04-24 15:29:06
【问题描述】:

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

void Thread::startTiming() {
    gettimeofday(&_timeInReady, NULL);
}

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

double Thread::getTimeInReady() const {
    return TIME(_timeInReady.tv_sec,_timeInReady.tv_usec);
}

TIME 是#define TIME(a,b) ((a*1000000) + b),所以我得到了总时间(以微秒为单位)。

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

有什么想法吗?谢谢!

【问题讨论】:

  • 究竟是什么让你认为你有负数?如果是打印声明,请出示。如果是调试器检查,请告诉我们更多信息。

标签: c++ gettimeofday


【解决方案1】:

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

unsigned long long Thread::getTimeInReady() const
{
    return (unsigned long long)_timeInReady.tv_sec * 1000000ULL +
        (unsigned long long)_timeInReady.tv_usec;
}

您的系统可能有uint64_t,它比unsigned long long 更简洁,或者您可以使用typedef

【讨论】:

    【解决方案2】:

    在我的计算机上,tv_sectv_usec1000000 都是有符号的 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。随你(由你决定。

    【讨论】:

      【解决方案3】:

      试试这个以获得 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 2018-05-07
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多