C++ 确定用户&;线程使用的系统时间

C++ 确定用户&;线程使用的系统时间,c++,qt,multithreading,C++,Qt,Multithreading,我们有一个基于qthreads的工作流引擎,其中工作线程在将输入包放在队列上时提取它们,然后将它们的输出放在另一个队列上,以便其他工作线程运行下一阶段;依此类推,直到所有输入都已消耗,所有输出都已生成 通常,多个线程将运行同一任务,而其他线程将同时运行其他任务。我们希望对这些线程任务的性能进行基准测试,以确定优化工作的目标 很容易获得给定线程运行给定任务所花费的实际(已用)时间。我们只看一下线程run()过程开始和结束时POSIX times()函数返回值之间的差异。但是,我不知道如何获得相应的

我们有一个基于qthreads的工作流引擎,其中工作线程在将输入包放在队列上时提取它们,然后将它们的输出放在另一个队列上,以便其他工作线程运行下一阶段;依此类推,直到所有输入都已消耗,所有输出都已生成

通常,多个线程将运行同一任务,而其他线程将同时运行其他任务。我们希望对这些线程任务的性能进行基准测试,以确定优化工作的目标


很容易获得给定线程运行给定任务所花费的实际(已用)时间。我们只看一下线程run()过程开始和结束时POSIX times()函数返回值之间的差异。但是,我不知道如何获得相应的用户和系统时间。从传递给times()的
struct tms
中获取这些数据是不起作用的,因为该结构给出了当所讨论的线程处于活动状态时所有线程运行的总用户和系统时间。

假设这是在Linux上,那么getrusage()和RUSAGE\u线程如何?Solaris还提供了类似的RUSAGE_LWP,我想其他类似POSIX的系统可能也有类似的版本

粗略的例子:

#define _GNU_SOURCE
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#include <unistd.h>

struct tinfo {
  pthread_t thread;     
  int id;
  struct rusage start;
  struct rusage end;
};

static void *
thread_start(void *arg)
{
  struct tinfo *inf = arg;
  getrusage(RUSAGE_THREAD, &inf->start);
  if (inf->id) {
     sleep(10);
  }
  else {
     const time_t start = time(NULL);
     while (time(NULL) - start < 10); // Waste CPU time!
  }
  getrusage(RUSAGE_THREAD, &inf->end);
  return 0;
}

int main() {
  static const int nrthr = 2;
  struct tinfo status[nrthr];
  for (int i = 0; i < nrthr; ++i) {
     status[i].id = i;
     const int s = pthread_create(&status[i].thread, 
                                            NULL, &thread_start, 
                                            &status[i]);
     assert(!s);
  }

  for (int i = 0; i < nrthr; ++i) {
     const int s = pthread_join(status[i].thread, NULL);
     assert(!s);
     // Sub-second timing is available too
     printf("Thread %d done: %ld (s) user, %ld (s) system\n", status[i].id, 
              status[i].end.ru_utime.tv_sec - status[i].start.ru_utime.tv_sec, 
              status[i].end.ru_stime.tv_sec - status[i].start.ru_stime.tv_sec);
  }  
}
定义GNU源
#包括
#包括
#包括
#包括
#包括
#包括
结构tinfo{
pthread\u t线程;
int-id;
结构图像开始;
结构图像结束;
};
静态空隙*
线程\u开始(无效*arg)
{
结构tinfo*inf=arg;
getrusage(RUSAGE_线程,&inf->start);
如果(inf->id){
睡眠(10);
}
否则{
常数时间\u t开始=时间(空);
while(time(NULL)-start<10);//浪费CPU时间!
}
getrusage(RUSAGE_线程,&inf->end);
返回0;
}
int main(){
静态常数int nrthr=2;
结构tinfo状态[nrthr];
对于(int i=0;i

我认为在windows上使用GetProcessTimes()可以实现类似的功能。

我认为您需要一个探查器来完成这项工作。