我正在尝试在发生中断时启动一个线程。但是,我已经意识到我无法从中断处理程序(或中断处理程序直接或间接调用的任何函数)中启动一个线程。所以,我决定要让处理程序断言一个标志。然后,一个单独的线程连续监视该标志,如果它被断言,它将依次创建(并启动)一个线程。这是一个伪代码:
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
答案 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的信号量并将此信号量发布到信号处理函数
中然后,上面的线程将被唤醒并做你想做的事情(创建线程)