如何在C中测量每个线程的时间?

如何在C中测量每个线程的时间?,c,multithreading,time,pthreads,time-measurement,C,Multithreading,Time,Pthreads,Time Measurement,我正在处理一个有多个线程的代码,我想打印完成分配给第I个线程的任务所花费的时间。这意味着我要打印每个线程使用doSomeThing函数所花费的时间 int main(int argc, char *argv[]){ // ... i=0; while (i < NumberOfThreads){ check = pthread_create(&(id_arr[i]), NULL, &doSomeThin

我正在处理一个有多个线程的代码,我想打印完成分配给第I个线程的任务所花费的时间。这意味着我要打印每个线程使用doSomeThing函数所花费的时间

int main(int argc, char *argv[]){
   // ...
         i=0;
         while (i < NumberOfThreads){

              check = pthread_create(&(id_arr[i]), NULL, &doSomeThing, &data);

              i++;
         }
   // ...
}

void* doSomeThing(void *arg){
   // ...
}
intmain(intargc,char*argv[]){
// ...
i=0;
while(i
如果我在
pthread\u create
之前添加
gettimeofday(&thread\u start,NULL)
,然后在
pthread\u create
之后添加
gettimeofday(&thread\u end,NULL)
,我实际上是在测量每个线程花费的时间,还是仅仅是主线程花费的时间?如果我将
gettimeofday
放在
doSomething
函数中,它们不会创建竞态条件吗


如果您对如何测量每个线程的时间有任何想法,请告诉我,谢谢。

您当然可以在线程函数本身内部使用
gettimeofday
。使用局部(堆栈)变量是完全线程安全的——每个线程都在自己的堆栈上运行(根据定义)


如果在
pthread_create()
周围放置相同的代码,则只能看到创建而不是执行线程所花费的时间。如果
pthread\u create
在线程完成之前被阻止,那么使用线程就没有意义了

当然可以在线程函数本身内部使用
gettimeofday
。使用局部(堆栈)变量是完全线程安全的——每个线程都在自己的堆栈上运行(根据定义)

如果在
pthread_create()
周围放置相同的代码,则只能看到创建而不是执行线程所花费的时间。如果
pthread\u create
在线程完成之前被阻止,那么使用线程就没有意义了

gettimeofday()测量经过的时间。如果要测量CPU时间,请尝试以下操作:

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stdint.h>

uint64_t time_used ( ) {
   struct rusage ru;
   struct timeval t;
   getrusage(RUSAGE_THREAD,&ru);
   t = ru.ru_utime;
   return (uint64_t) t.tv_sec*1000 + t.tv_usec/1000;
}

...

uint64_t t1, t2;
t1 = time_used();
... do some work ...
t2 = time_used();
printf("used %d milliseconds\n",(unsigned)(t2-t1));
gettimeofday()测量经过的时间。如果要测量CPU时间,请尝试以下操作:

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stdint.h>

uint64_t time_used ( ) {
   struct rusage ru;
   struct timeval t;
   getrusage(RUSAGE_THREAD,&ru);
   t = ru.ru_utime;
   return (uint64_t) t.tv_sec*1000 + t.tv_usec/1000;
}

...

uint64_t t1, t2;
t1 = time_used();
... do some work ...
t2 = time_used();
printf("used %d milliseconds\n",(unsigned)(t2-t1));

我想我应该测量经过的时间,但我会仔细检查,如果不是,我一定会执行你的建议,谢谢。我想我应该测量经过的时间,但我会仔细检查,如果不是,我一定会执行你的建议,谢谢。
void time_used ( struct timeval *t ) {
   struct rusage ru;
   getrusage(RUSAGE_THREAD,&ru);
   *t = ru.ru_utime;
}

...

struct timeval t0, t1, dt;
time_used(&t0);
... do some work ...
time_used(&t1);
timersub(&t1, &t0, &dt);

printf("used %d.%06d seconds\n", dt.tv_sec, dt.tv_usec);