У меня есть следующая функция, которая вызывается из pthread_create. Эта функция выполняет некоторую работу, устанавливает таймер, выполняет некоторую другую работу, а затем ждет, пока таймер не истечет, прежде чем снова выполнить цикл. Однако при первом запуске таймера по истечении его срока программа завершает работу, и я не совсем понимаю, почему. Он никогда не должен выходить из бесконечного цикла while. Основной поток ничего не получает из этого потока и наоборот (пока).
Я предполагаю, что у меня может быть что-то неправильно настроено с потоком, или таймер неправильно вызывает функцию обработчика. Возможно, изменение глобальной переменной IDLE из потока вызывает проблему.
Я хотел бы вызвать обработчик без сигналов, отсюда и использование SIGEV_THREAD_ID. Я все равно использую сигналы SIGSRx в основном потоке. Любые мысли о том, что я начал здесь, что может быть не так?
#ifndef sigev_notify_thread_id
#define sigev_notify_thread_id _sigev_un._tid
#endif
volatile sig_atomic_t IDLE = 0;
timer_t timer_id;
struct sigevent sev;
void handler() {
printf("Timer expired.\n");
IDLE = 0;
}
void *thread_worker() {
struct itimerspec ts;
/* setup the handler for timer event */
memset (&sev, 0, sizeof(struct sigevent));
sev.sigev_notify = SIGEV_THREAD_ID;
sev.sigev_value.sival_ptr = NULL;
sev.sigev_notify_function = handler;
sev.sigev_notify_attributes = NULL;
sev.sigev_signo = SIGRTMIN + 1;
sev.sigev_notify_thread_id = syscall(SYS_gettid);
/* setup "idle" timer */
ts.it_value.tv_sec = 55;
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 0;
if (timer_create(0, &sev, &timer_id) == -1) {
printf("timer_create failed: %d: %s\n", errno, strerror(errno));
exit(3);
}
while (1) {
// do work here before timer gets started that takes 5 seconds
while (IDLE); /* wait here until timer_id expires */
/* setup timer */
if (timer_settime(timer_id, 0, &ts, NULL) == -1) {
printf("timer_settime failed: %d\n", errno);
exit(3);
}
IDLE = 1;
// do work here while timer is running but that does not take 10 seconds
}
}