В следующем опубликованном коде я использовал высокий пошаговый таймер «timer_create» для вызова функции обратного вызова периодически через каждые 1 миллисекунду (посильный таймер говорит, что он может обеспечить задержку в микросекунду) , Если я запускаю только один экземпляр исполняемого файла, он работает нормально, и обратный вызов вызывается каждые 1 миллисекунду, но если я запускаю несколько экземпляров одного и того же исполняемого файла (например, 10 экземпляров, и в каждом экземпляре я настроил 1 миллисекундный периодический таймер), представляет собой задержку приблизительно от 2 до 4 миллисекунд при вызове функции обратного вызова в каждом случае. Ниже приведена программа.linux высокая разрешающая способность posix задержка из-за нескольких процессов
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <errno.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); }while(0)
unsigned long long old_time = 0, diff = 0;
timer_t timerid;
struct sigaction sa;
struct sigevent sev;
struct itimerspec its;
static void timer_cb(int sig, siginfo_t *si, void *uc)
{
unsigned long long time = 0;
struct timeval tv;
gettimeofday(&tv, NULL);
time = (tv.tv_sec * 1000000) + tv.tv_usec;
if(old_time != 0)
{
diff = time - old_time;
if (diff > 1100)
{
printf("%lld\n",diff);
}
}
old_time = time;
}
int main (void)
{
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_cb;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGRTMIN, &sa, NULL) == -1)
errExit("sigaction");
/* Create the timer */
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGRTMIN;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1)
errExit("timer_create");
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1000 * 1000;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 1000 * 1000;
if (timer_settime(timerid, 0, &its, NULL) < 0)
{
errExit("timer_settime");
}
while(1)
{
sleep(10);
}
return 0;
}
Существует ничего плохого в коде выше, который вызывает задержку или есть другой способ добиться задержки в 1 миллисекунду правильно.
Мы пробовали вышеуказанный код за 100 миллисекунд, даже в этом случае с несколькими экземплярами, он дает ошибку около 50+ миллисекунд, так это значит, что он работает только в секундах домена. – RaviGaniga
Как я уже писал, Linux не является ядром реального времени, поэтому вы не можете ожидать точного времени. Планировщик просто не поддерживает его - если вы не используете одно из расширений реального времени – jbr