3

私はスレッドライブラリを作成しています。スレッドをスケジュールするときは、スレッドの準備ができている時間を知る必要があります。すべてのスレッドインスタンスには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など)が発生することです。

何か案は?ありがとう!

4

3 に答える 3

5

小数秒ではなく、整数マイクロ秒の結果が必要なため、結果を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ます。

于 2012-04-24T15:36:59.747 に答える
1

私のコンピューターでは、、、およびのすべてがtv_sec32tv_usecビット1000000量で署名されています。符号付き32ビット値は、2^31程度より大きい数値を保持するように要求されるとオーバーフローします。

結果として、この式は次のようになります。

((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値を使用して実行されます。

に変更することはできますが、変更する必要はありませdoubleuint64_t。それはあなた次第です。

于 2012-04-24T16:06:50.643 に答える
0

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;
于 2018-04-02T09:08:30.480 に答える