0

これは、スレッド実行関数の実行時間を計算するコードの下に記述したサブスレッドの 1 つで、マルチスレッド アプリケーションです。

       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]
もう 1 つの関数を追加 -- PrintStatistics()

4

1 に答える 1

2

スレッドはランタイムを測定していません。彼らは、開始時間と終了時間の差を (大まかに) 測定しています。その間、それらは常に実行されているわけではありません。複数のスレッド (およびマシン上に複数のプロセス) があるため、それらはプロセッサ時間を共有しているため、開始から終了までの時間の一部はアイドル状態で費やされます。

次のことを想像してみてください。2 人の人が午前 9 時に出社します。彼らは、フォークリフトの運転などのタスクを交代で実行し、スイッチを切り続け、タスクの実行と休憩を交互に午後 5 時まで行い、その時点で退勤します。合計で 16 時間の作業が記録されていますが、フォークリフトは 8 時間しか稼働しておらず、1 日 (ここではプログラムの実行時間) は 8 時間しかありませんでした。あなたのプログラムは、タイムインとタイムアウトの差を測定しています。

于 2013-06-25T04:07:55.087 に答える