2011-09-07 15 views
4

デュアルコアマシンで次のコードを実行しています。setitimer question

同じPC上でアプリケーションのインスタンスを1つまたは2つ実行しているとき、正しいタイミング解像度は100msです。しかし、私は同じPC上で同じアプリケーションの3つのインスタンスを実行すると、タイミングの解像度は100ミリ秒以上です。 3つのアプリケーションインスタンスを100msecの同じ解像度で動作させることは可能ですか?これは私のマシン上のコアの数に関連していますか?

#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 

void timer_handler (int signum) 
{ 
    double time ; 
    // obtain time here 
    gettimeofday() ; 
    printf("timer_handler at time = %lf \n", 
    time) ; 
} 

int main() 
{ 
    struct sigaction sa; 
    struct itimerval timer ; 

    memset (&sa, 0, sizeof (sa)) ; 

    sa.sa_handler = &timer_handler ; 
    sigaction (SIGALRM, &sa, NULL); 

    timer.it_value.tv_sec = 0 ; 
    timer.it_value.tv_usec = 100000; 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = 100000 ; 

    setitimer (ITIMER_REAL, &timer, NULL) ; 

    for (;;); 
} 

答えて

3

マニュアルページsetitimer(2)には、以下があります。

タイマーは、システムタイマの分解能 に依存し、要求された時間より前に期限切れになりませんが、その後いくつかの (短い)時間を期限切れにすることができ、システムの負荷;時間(7)を参照してください。

明らかに、アプリケーションのインスタンスをさらに実行すると、システム負荷が高くなり、タイマーの精度が低下します。

あなたがビジーループ交換する場合:以下の何か(IOバインドされたワークロードのような)CPUバウンドで

for (;;); 

のタイミングがより正確になります。

+0

あなたのヒントありがとうございます!私はsem_waitをforループ内で使用し、sem_postをtimer_handler内で使用して問題を解決します。 –

+0

この投稿の用途は何ですか?完全なソリューションを投稿してください。 – user3236841