从中断处理程序内部启动一个线程

时间:2013-07-11 00:53:56

标签: c multithreading pthreads interrupt-handling

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

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。这个问题与之前发布的问题有些相关:

Sharing data between master thread and slave thread in interrupt driven environment in C

2 个答案:

答案 0 :(得分: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
  }
}

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

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

答案 1 :(得分:1)

你也可以使用POSIX信号量

您可以通过等待

阻止的线程等待初始值为0的信号量

并将此信号量发布到信号处理函数

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