【问题标题】:setitimer question设置定时器问题
【发布时间】:2011-09-07 11:01:25
【问题描述】:

我的双核机器上运行了以下代码。

当我在同一台 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 (;;); 
}

【问题讨论】:

    标签: c linux setitimer


    【解决方案1】:

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

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

    显然,当您运行应用程序的更多实例时,系统负载会变得更高,并且计时器的准确性会降低。

    如果你替换繁忙的循环:

    for (;;);
    

    如果 CPU 限制较少(如 IO 限制工作负载),时间会变得更加准确。

    【讨论】:

    • 感谢您的提示!我在 for 循环中使用 sem_wait 并在 timer_handler 中使用 sem_post 并解决了问题。
    • 这个帖子有什么用?您能否发布一个完整的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多