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 秒,比整个应用程序的时间还长。为什么会发生这种情况?

[更新]
增加了一项功能——PrintStatistics()

4

1 回答 1

2

您的线程没有测量它们的运行时间;他们正在(粗略地)测量开始时间和结束时间之间的差异。在那段时间里,它们不是一直在运行;由于有多个线程(和您的机器上的多个进程),它们共享处理器时间,因此在开始和结束之间的时间间隔中的一些时间是空闲的。

想象一下:两个人早上 9 点上班。他们轮流执行一些任务——例如驾驶叉车——然后继续关机,在执行任务和休息之间交替进行,直到下午 5 点,此时他们下班。他们一起记录了 16 个小时的工作,但叉车只运行了 8 个小时,工作日(这里是您的程序的运行时间)只有 8 个小时。您的程序正在测量时间-超时差。

于 2013-06-25T04:07:55.087 回答