c++ - 为什么一个子线程的执行时间比整个应用程序的执行时间多

标签 c++ linux multithreading performance

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

       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()

最佳答案

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

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

关于c++ - 为什么一个子线程的执行时间比整个应用程序的执行时间多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287188/

相关文章:

java - 对于写入固定大小数组的不同部分的并行线程,是否存在线程安全的 Java 数据结构?

C++ P线程。 pthread_create 的参数

python - 直接从 CPU 读取 TEMPERATURE_TARGET

linux - SIGHUP 重新加载配置

linux - vmdk to qcow convert 显示问题

c++ - 终止正在运行的线程 c++ std::thread

c++ - 如何使用 C++ 从软件内部禁用特定的 Windows 热键?

c++ - 具有取决于整数模板的参数的构造函数的模板参数推导技巧

python - 终端中的字节顺序颠倒

multithreading - 在 Spring Batch 作业中使用多线程步骤