Резьба таймера в C - PullRequest
       26

Резьба таймера в C

0 голосов
/ 02 августа 2020

Я кодирую C на Ubuntu. Мне нужно написать поток таймера в C. У меня есть этот поток

void * thread(void)
{
    sleep(TIMEOUT);
    pthread_mutex_lock(&mutex);
    //operations
    pthead_mutex_unlock(&mutex);

}

Мне нужно, чтобы другой поток, например, timerManager, мог сбросить таймер. Моя первая идея заключалась в том, чтобы убить этот поток и создать еще один, но это проблема, потому что, если я убью этот поток таймера с помощью pthread_cancel, когда он ждет мьютекса, я создам тупик, потому что мьютекс находится в состоянии блокировки.

Что делать? Заранее всем спасибо.

1 Ответ

1 голос
/ 03 августа 2020
pthread_mutex_t watchdog_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  watchdog_cond  = PTHREAD_COND_INITIALIZER;
int reset_watchdog = 0;

void reset_watchdog(void) {
   pthread_mutex_lock(&watchdog_mutex);
   reset_watchdog = 1;
   pthread_cond_signal(&watchdog_cond);
   pthead_mutex_unlock(&watchdog_mutex);
}

void watchdog(void) {
   struct timespec sleep_until = { 0 };
   sleep_until.tv_sec = time(NULL) + TIMEOUT;

   pthread_mutex_lock(&watchdog_mutex);

   // Loop until a time out.
   while (!pthread_cond_timedwait(&watchdog_cond, &watchdog_mutex, &sleep_until)) {
      if (reset_watchdog) {
         sleep_until.tv_sec = time() + TIMEOUT;
         reset_watchdog = 0;
      }
   }

   pthead_mutex_unlock(&watchdog_mutex);

   // ...
}
...