3

我试图在中断发生后立即启动一个线程。但是,我意识到我无法从中断处理程序(或任何由中断处理程序直接或间接调用的函数)中启动线程。所以,我决定做的是让处理程序断言一个标志。然后,一个单独的线程持续监视该标志,如果它被断言,它将依次创建(并启动)一个线程。这是一个伪代码:

int interrupt_flag = 0;

interrupt_handler(void)
{
  interrupt_flag = 1
}

monitoring_thread(void) //this thread is started at the start of the program
{
  while(1)
  {
    if(interrupt_flag)
    {
      interrupt_flag = 0;
      //start the thread here
      sleep(/*some amount of time*/);
    }
  }
}

我对有一个专门的 while 循环不断监视标志并不满意。这样做的问题是它显着降低了我程序中其他线程的速度。出于这个原因,我调用了 sleep 函数来提高程序中其他线程的速度。

问题:有没有一种方法可以在中断时真正启动线程,而无需专门的 while 循环?是否有从中断处理程序中启动线程的解决方法?

如果有什么不同,我正在使用 POSIX 库。

谢谢,

PS。这个问题与此处发布的早期问题有些相关:

C语言中断驱动环境中的主线程和从线程之间共享数据

4

2 回答 2

4

它可以等到中断处理程序提供应生成线程的通知,而不是让您的监视线程在标志上旋转。一种方法是使用信号量:

sem_t interrupt_sem;

void interrupt_handler(void)
{
  sem_post(&interrupt_sem);
}

void monitoring_thread(void)
{
  while(1)
  {
    sem_wait(&interrupt_sem);
    //start the thread here
  }
}

以前,我有一个基于条件变量的解决方案,但如果中断处理程序进行阻塞调用,您的系统不太可能正常运行。它可能导致死锁或其他未定义的行为,因为系统中的变量在中断发生时可能没有一致的值。

正如我和其他人在评论中指出的那样,您的操作系统应该提供某种接口来显式唤醒等待任务。在上面的代码中,我们假设监控线程始终在后台处于活动状态。

于 2013-07-11T01:12:28.570 回答
1

你也可以使用 POSIX 信号量

您可以等待一个初始值为 0 的信号量,该线程将被等待阻塞

并将此信号量发布到您的信号句柄函数中

然后,上面的线程将被唤醒并做你想做的事情(创建线程)

于 2013-07-11T01:25:58.617 回答