2011-09-07 24 views
4

我在我的雙核心機器上運行以下代碼。setitimer問題

當我在同一臺PC上運行應用程序的一個或兩個實例時,我具有100毫秒的正確時間分辨率。但是,當我在同一臺PC上運行同一應用程序的3個實例時,時間分辨率大於100毫秒。是否有可能讓3個應用程序以100毫秒的相同分辨率運行?這與我的機器上的內核數量有關嗎?

#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)。

顯然,當您運行更多應用程序的實例時,系統負載會變得更高,定時器的準確性也會降低。

如果更換繁忙的循環:

for (;;); 

與結合東西少CPU(如IO約束工作量),時間將變得更加準確。

+0

感謝您的提示!我在for循環中使用sem_wait,在timer_handler中使用sem_post並解決了問題。 –

+0

這篇文章有什麼用?您可以請發佈完整的解決方案嗎? – user3236841