Сетитимер вопрос - PullRequest
       8

Сетитимер вопрос

4 голосов
/ 07 сентября 2011

На моем двухъядерном компьютере работает следующий код.

Когда я запускаю один или два экземпляра приложения на одном и том же ПК, правильное временное разрешение составляет 100 мс.Однако, когда я запустил 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 Ответ

3 голосов
/ 08 сентября 2011

Страница справочника setitimer(2) имеет следующее:

Таймеры никогда не истечут раньше запрошенного времени, но могут истечь некоторое (короткое) время спустя, что зависит от разрешения системного таймера и отзагрузка системы;см. time (7).

Очевидно, что при запуске большего количества экземпляров приложения нагрузка на систему возрастет, а таймеры будут менее точными.

Если вы замените цикл занятости:

for (;;);

с чем-то менее связанным с ЦП (например, с нагрузкой на IO), время станет более точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...