使用计时器控制C中的信号量

时间:2016-03-08 22:17:58

标签: c multithreading timer semaphore

我试图使用计时器来控制进程。 (只是试图看看它是如何工作的,以便在另一个程序中实现它。该程序的目的是在特定的时间间隔内调用一个函数。但是当我这样做时,它发现它使用了太多的CPU。我和#39;我也试图避免使用sleep.I让计时器工作,它在while循环中实现了什么,所以它占用了所有的CPU。

我想要的是timer_handler解锁线程,以便它可以继续执行程序的其余部分,并且还可以以精确的间隔执行相同的精确操作。

这是我到目前为止的代码

   int sem_init(sem_t *sem, int pshared, unsigned int value);
   int sem_wait(sem_t *sem);
   int sem_getvalue(sem_t *sem, int *sval);


   int set_count = 0;
   static int count = 0;
   int timer_set();

   sem_t sem;

   struct inits{
    struct sigaction sa;
    struct itimerval timer;

   }inits[1];



   int timer_handler (int signum)
   {

    printf ("timer expired %d times\n", ++count);

    if(sem_post(&sem)== -1){
     write(STDERR_FILENO, "sem_post() failed \n", 18);
     _exit(EXIT_FAILURE);
     return 0;
    }
    else
     return 0;
   }

   int timer_set(){
    memset (&inits[0].sa, 0, sizeof (inits[0].sa));
    inits[0].sa.sa_handler = timer_handler;
    sigemptyset(&inits[0].sa.sa_mask);
    inits[0].sa.sa_flags = 0;
    printf("sigaction successfull: \n");
   /* Configure the timer to expire after 1000 msec... */
     inits[0].timer.it_value.tv_sec = 1;
     inits[0].timer.it_value.tv_usec = 0;
     /* ... and every 1000 msec after that. */
     inits[0].timer.it_interval.tv_sec = 1;
     inits[0].timer.it_interval.tv_usec = 0;
     /* Start a virtual timer. It counts down whenever this process is
       executing. */
     if(setitimer (ITIMER_VIRTUAL, &inits[0].timer, NULL) == -1)
      handle_error("timer set failed: ");

     printf("timerset successful\n");

     return 0;
   }
   int main ()
   {

     int s = 1;
     int j;
     int* sval;

     printf("S value = %d\n", s);
   // scanf("\n%d", &set_count);
    if (sem_init(&sem, 1, 1) == -1)
      handle_error("sem_init");
    else{
     printf("sem_init successful\n");
     printf("sem_init has been set  s = %d\n", s);
    }

    printf("j = %d\n",  j=timer_set());
    /* Do busy work. */
    while (1)
      {
       sem_getvalue(&sem, sval);
       if (errno==EINVAL)
        handle_error("Error returned on sem_getvalue: ");

       printf("entered while loop\n, S = %d\n",  *sval);

       while ((s= sem_wait (&sem))==0 && errno == EINTR)
       {
        printf("entered while loop, S = %d\n", *sval);
        printf("entered sem while loop\n");
        continue;
       }
       if (s == -1)
        handle_error("Semaphore Wait failed\n");
        else
         printf("Semaphore Successful\n");
      }
    printf("thank you for using this  timer. ADIOS!\n");
    exit(1);
   }

问题在于它没有经历第二次循环,而是冻结。

抱歉,我还没弄明白如何发布正确的代码,所以如果它看起来很奇怪我会道歉。 。 此外,我已经研究了一段时间了,所以如果我在研究中遗漏了一些可能会或可能没有回答我问题的事情,我会道歉。

提前致谢

0 个答案:

没有答案