2011-09-07 22 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