Установка settimer () и SIGALRM, пока переменная условия не сигнализируется - PullRequest
0 голосов
/ 06 мая 2019

У меня есть несколько практических вопросов о settimer () и SIGALRM и о том, как они работают.

Допустим, у меня есть несколько созданных тем: (EDITED)

#define _POSIX_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#include <sys/time.h> 
#include <signal.h> 

pthread_mutex_t lock;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

void timer_handler (int signum)
{
  printf ("\n[WAITING LINE] All our assistants are busy at the moment,we apologize. Please wait on the line\n");
}

void* threadFunc(void* arg){

        struct itimerval timer;
        if (signal(SIGALRM, (void (*)(int)) timer_handler) == SIG_ERR) {
            perror("Unable to catch SIGALRM");
            exit(1);
        }
        timer.it_value.tv_sec =1;
        timer.it_value.tv_usec = 0;


    while(mycond){
        if(setitimer (ITIMER_REAL, &timer, NULL)){
            perror("error calling setitimer()");
            exit(1);
        }

        pthread_cond_wait(&cond1,&lock);

        //doing other things that take significant time
    }


}

int main(){

//initializing mutex
....

//creating the threads
....
//waiting the threads to join
....
return 0;

}

Я не получаю сообщение, которое должно было отображаться каждые 20 мсек.В примере, которому я следовал, некоторое время (1) было реализовано после settimer, но
Я не могу этого сделать, потому что я хочу, чтобы это сообщение отображалось, пока мой поток ожидает сигнала условия.На самом деле не имеет значения, что реализовано в остальном коде, давайте предположим, что для завершения и отправки условия требуется гораздо больше времени, чем 20 мс.

Что я должен делать, чтобы получать сообщение timer_handler каждые 20 мс, пока выполняется условиееще не сигнализируется?

Я новичок в использовании как условных переменных, так и settimer (), поэтому любая помощь в их понимании и устранении любых недоразумений приветствуется.

1 Ответ

0 голосов
/ 06 мая 2019

Если все ваши потоки заблокированы, часы виртуального таймера не будут работать.Возможно, вам придется переключиться на ITIMER_REAL.(Также помните, что вы не должны использовать небезопасные функции асинхронного сигнала, такие как printf внутри обработчика сигнала.)

...