Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 塞蒂蒂默问题_C_Linux_Setitimer - Fatal编程技术网

C 塞蒂蒂默问题

C 塞蒂蒂默问题,c,linux,setitimer,C,Linux,Setitimer,我的双核机器上运行以下代码 当我在同一台电脑上运行一个或两个应用程序实例时,我的正确计时分辨率为100毫秒。但是,当我在同一台PC上运行同一应用程序的3个实例时,时间分辨率超过100毫秒。是否有可能使应用程序的3个实例以100毫秒的相同分辨率运行?这与我的机器上的内核数有关吗 #include <signal.h> #include <stdio.h> #include <string.h> #include <sys/time.h> void

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

当我在同一台电脑上运行一个或两个应用程序实例时,我的正确计时分辨率为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 (;;); 
}
#包括
#包括
#包括
#包括
无效计时器\u处理程序(整数符号)
{
双倍时间;
//在这里获得时间
gettimeofday();
printf(“计时器处理程序在时间=%lf\n”,
时间);
}
int main()
{ 
struct-sigaction-sa;
结构itimerval定时器;
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\u interval.tv\u usec=100000;
setitimer(ITIMER\U REAL和timer,NULL);
对于(;);
}

手册页面
设置定时器(2)
具有以下内容:

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

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

如果更换忙循环:

for (;;);

使用CPU限制较少的设备(如IO限制的工作负载),计时将更加准确。

谢谢您的提示!我在for循环中使用sem_wait,在timer_处理程序中使用sem_post,它解决了这个问题。这个post有什么用?你能发布一个完整的解决方案吗?