2010-12-30 12 views
0

マルチスレッドリアルタイムアプリケーションのパフォーマンススケールを測定しています。クリティカルセクションの実行時間 ミューテックスロック待機時間とウォッチドッグ

と:mutex.unlock> - 私はmutex.lock間過ごし

  • 時間をミューテックスをロックするための時間を待っ

    1. に費やした時間を測定するためのアダプタを作成する必要がありますまた、ロックタイマーやウォッチドッグタイマーなどのコンポーネント。設定された時間以上mutexロックを保持しているスレッドであればエラーログに通知する必要があります。

      これを行うにはどのような方法がいいですか?

  • +1

    Windows用ですか? WaitForSingleObject()を使用していますか? Jaywalker氏が指摘したように – Jaywalker

    +0

    では、この質問はOSに関連しているので、これを指定する必要があります。 – Simone

    +0

    @ Jaywalker&Simone - それはSolarisプラットフォーム上にあります。 Sun Sparc 32Gig RAM(8コア搭載)それはコンテキストの切り替えの多くを持って... – Naveen

    答えて

    0

    mutexを呼び出す前とmutexを取得する前に、標準のctimeを使用して時間を取ることができます。これらの2つの違いは、あなたのスレッドがmutexを得るのを待っていたおおよその時間を与えるでしょう。
    プロセス2がクリティカルセクションの実行時間を見つけるために同様のプロセスを実行できます。

    0

    おそらくRAIIイディオムが役立ちます。たとえば:

    class MutexHolder 
    { 
    public: 
        MutexHolder() 
        { 
         //here you should take start time 
         m_mutex.lock(); 
         //here you should take time and find a differnce between start time 
        } 
        ~MutexHolder() 
        { 
         m_mutex.unlock(); 
         //here you should track the time spent between mutex.lock -> mutex.unlock and do smth else 
        } 
    private: 
        Mutex m_mutex; 
    }; 
    

    は、次にクラスを使用する:あなたが行うことができます簡単

    //your code 
    
    {//start of critical section 
        MutexHolder lock; 
    
        //code guarded by mutex locking 
    
    }//here the destructor of the MutexHolder object will call automatically 
    
    0

    何かが統計カウンタのようなものを使用しています。まず、/()/のGetTickCount()の例のクロックのために...もちろん最高ですすべてのあなたが持っているタイマー...細かい粒度と低オーバーヘッドを使用した後、10

    int timecounters[10]; 
    

    言う...あなたが必要とするどのように多くのカウンタを定義しますQueryPerformanceCounter/rdtsc。 1

    struct StopWatch 
    { 
        int n; 
        StopWatch(int n) : n(n) { timecounters[n] -= timer(); } 
        ~StopWatch() { timecounters[n] += timer(); } 
    }; 
    

    以下、あなたはプログラムの実行の終了時

    { 
        StopWatch sw(1); 
        // code to be instrumented 
    } 
    

    を書くトレースする必要があるコードのすべてのセクションのためにあなたは合計時間を持っていますよう は、最後にストップウォッチクラスを使用します様々な計装されたセクションで費やされ、オーバーヘッドは非常に低くなるはずです。これは、例えば、単一の実行時間の制限チェック...を追加することも簡単です。もちろん

    struct WatchDog 
    { 
        int n, limit, start; 
    
        WatchDog(int n, int limit) : n(n), limit(limit) 
        { 
         start = timer(); 
        } 
    
        ~WatchDog() 
        { 
         int delta = timer() - start; 
         if (delta > limit) 
         { 
          log("WatchDog(%i): Time limit exceeded (%i > %i)", 
           n, delta, limit); 
         } 
         timecounters[n] += delta; 
        } 
    }; 
    

    それはもはやそれは...それだけ報告します必要以上かかる場合WatchDogクラスは活動を中断することはありません問題の終わりに。本当の中断の一般的なウォッチドッグクラスは実装する方がはるかに複雑です。

    関連する問題