【发布时间】:2021-03-01 18:22:41
【问题描述】:
我必须在多个线程期间经过测量时间。我必须得到这样的输出:
Starting Time | Thread Number
00000000000 | 1
00000000100 | 2
00000000200 | 3
首先,我使用了 gettimeofday,但我看到有一些负数,然后我几乎没有研究并了解到 gettimeofday 不能可靠地测量经过的时间。然后我决定使用clock_gettime(CLOCK_MONOTONIC)。
但是,有一个问题。当我用秒来测量时间时,我无法精确地测量时间。当我使用纳秒时, end.tv_nsec 变量的长度不能超过 9 位(因为它是一个长变量)。这意味着,当它必须移动到第 10 位时,它仍然保持在 9 位,实际上数字变小了,导致经过的时间为负数。
这是我的代码:
long elapsedTime;
struct timespec end;
struct timespec start2;
//gettimeofday(&start2, NULL);
clock_gettime(CLOCK_MONOTONIC,&start2);
while(c <= totalCount)
{
if(strcmp(algorithm,"FCFS") == 0)
{
printf("In SErunner count=%d \n",count);
if(count > 0)
{
printf("Count = %d \n",count);
it = deQueue();
c++;
tid = it->tid;
clock_gettime(CLOCK_MONOTONIC,&end);
usleep( 1000*(it->value));
elapsedTime = ( end.tv_sec - start2.tv_sec);
printf("Process of thread %d finished with value %d\n",it->tid,it->value);
fprintf(outputFile,"%ld %d %d\n",elapsedTime,it->value,it->tid+1);
}
}
不幸的是,timespec 没有微秒变量。如果你能帮助我,我会很高兴的。
【问题讨论】:
-
阅读clock_gettime(2) 和time(7)。你可以得到 - 理论上 - 纳秒,一微秒是 1000 纳秒
-
可以,但是纳秒变量不能超过9位。虽然循环迭代 nd.tv_nsec 在一段时间后变小。像这样:2*10^9, 5*10^9, 8*10^9, 1*10^9, 4*10^9, 7*10^9...。它是这样的,因为在定义中在 struct timespec 中,tv_nsec 被定义为 long。