【问题标题】:Timered operations in a critical section [C]关键部分中的定时操作 [C]
【发布时间】:2020-08-02 20:19:39
【问题描述】:

我在 Ubuntu 上用 C 语言编写代码。

我需要编写一个名为“timeredThread”的线程,它在 N 微秒后在临界区执行一些操作,如下所示:

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

}

另外,我需要另一个线程,例如“timerManager”,它可以重置前一个计时器。我的第一个想法是创建一个“timerManager”,它杀死“timeredThread”并创建另一个,但这不起作用,因为如果我在等待互斥锁时用 pthread_cancel() 杀死“timeredThread”,我会创建一个死锁。死锁是因为互斥体处于锁定状态而产生的。

我能做些什么呢? 在此先感谢大家。

【问题讨论】:

标签: c linux multithreading timer mutex


【解决方案1】:
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);

   // ...
}

【讨论】:

  • 嗨,如果我想要一个以微秒为单位的计时器,我该怎么办?有了这个解决方案,我只能在几秒钟内设置一个计时器
  • @ABC,其实这个方案支持纳秒。我将sleep_until.tv_nsec 设置为零,但您可以将其设置为任意数量。
  • 首先感谢您的回答。当我将 sleep_until.tv_nsec 设置为不同于 0 pthread_cond_timedwait 的数字时,立即返回。为什么?我是这样设置的:sleep_until.tv_nsec = time(NULL) + TIME;例如
  • 我有这个:sleep_until.tv_sec = time(NULL) + TIMEOUT; sleep_until.tv_nsec = time(NULL) + 1;所以我只在你的旧代码中添加了一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多