2013-06-25 28 views
0

这是一个多线程的应用程序中,我写了下面的代码来计算线程运行函数的执行时间的子线程的一个多:为什么一个子线程的执行时间比整个应用

 class CThreadObject{ 
      public: 
       ... 
       unsigned long GetTime(){ 
        struct timeval val; 
        gettimeofday(&val, NULL); 
        return (val.tv_sec * 1000000 + val.tv_usec); 
       } 

       static void* Run(void *param){ // thread function 
        while (1){ 
          static unsigned long ExecTime = GetTime(); 
          unsigned long LastExecTime = 0; 

          if (TurnOnTest()){ 
           LastExecTime = ExecTime; 
           ExecTime = GetTime(); 
          mQueue.push_back(ExecTime - LastExecTime);      
           //std::deque<unsigned long> mQueue 
          } 

          //some other jobs such as 
          //I/O demultiplex and events dispatching 
          ....... 
        }; 

        return NULL; 
       } 

       void PrintStatistics(){ 
        unsigned long tmp = 0; 
        while(mQueue.size()){ 
          tmp += *mQueue.begin(); 
          mQueue.pop_front(); 
        } 

        printf("the total time is %lu\n", tmp); 
       } 

      private: 
       ... 
       std::deque<unsigned long> mQueue; 
       pthread_t mThread; 
     }; 

该应用程序只执行1分钟,但我发现积累的时间为 gQueue的所有元素为175秒,大于整个应用程序的时间。 为什么会发生这种情况?

[UPDATE]
增加了一个功能 - PrintStatistics()

+1

不是答案,但我建议您在进行这些类型的时间测量时使用'clock_gettime(CLOCK_MONOTONIC)'。 'gettimeofday()'受系统时间影响,系统时间可能会改变(DST,NTP等) –

+2

当你说“我发现qQueue的所有元素累积的时间为175秒”时,你会怎样这是什么意思?你是否将gQueue的所有成员加在一起?如果是这样,那将是错误的,因为线程同时运行,并且每个单独的线程可以运行程序的长度。请在应用程序运行结束后发布gQueue的内容,以帮助我们理解您的问题。 – Nathanael

+0

你似乎在每次循环迭代中将'LastTime'初始化为0 ... –

回答

2

你的线程不被测量它们的运行时间;他们正在测量他们的开始时间和结束时间之间的差异(大致)。在那段时间里,他们不是一直在跑步;由于存在多个线程(并且您的计算机上有多个进程),因此它们共享处理器时间,因此在开始和结束之间的一段时间内都会闲置。

想象一下:两个人在上午9点开始工作。他们轮流执行一些任务 - 例如驾驶叉车 - 并继续关闭,在执行任务和休息之间交替进行,直至下午5点钟,此时他们会停下来。他们一起记录了16个小时的工作,但叉车只运行了8个小时,而工作日(这里是您的程序运行时间)只有8个小时。你的程序正在测量时间差异。

+0

但是如果应用程序运行了X分钟,那么每个线程的执行时间必须不超过X分钟,不需要它吗? – Steve

+1

@StevePeng - 正确,但如果您有N个线程正在运行,那么即使应用程序在少于X分钟内完成,所有线程的执行时间总和可能高达N * X分钟... – twalberg

+1

值得指出在多处理器机器上,这些线程实际上可以同时运行。为了发展你的比喻,我们可以让任何数量的工人在他们之间共享许多叉车。 – Nathanael

相关问题