setitimer问题

时间:2011-09-07 11:01:26

标签: c linux 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 (;;); 
}

1 个答案:

答案 0 :(得分:3)

手册页setitimer(2)包含以下内容:

  

定时器永远不会在请求的时间之前到期,但可能会过期   (短)之后的时间,这取决于系统计时器的分辨率   并在系统负载;看时间(7)。

显然,当您运行更多应用程序实例时,系统负载会更高,定时器也会更准确。

如果更换繁忙的循环:

for (;;);

使用较少的CPU限制(如IO绑定工作负载),时间将变得更加准确。