1. 概述
最近工作中遇到一个问题,我决定总结一下死锁的问题。在多线程的系统中经常需要利用锁来实现临界区的保护,但在临界区保护过程中经常出现加锁和解锁没有成对出现的问题。最终,系统进入死锁状态。在bcos中目前还没有实现锁的机制,即便如此任务间的调度最终也会引发临界区的问题。在bcos中解决临界区问题的方法是屏蔽中断,因为系统调度主要依靠中断来实现任务的抢占。如果在进入临界区时屏蔽系统所有中断,在退出临界区时解除中断的屏蔽可以实现类似于锁的功能。
2. 不可重入函数
在这里有必要讲解一下“不可重入函数”这个概念。“可重入函数”和“不可重入函数”的概念主要出现在操作系统和多线程系统中。可重入函数是指这个函数在执行过程中可以被打断,当系统重新调度到被打断的线程时这个函数的状态可以被恢复并继续执行并且不会改变函数执行的输出。相反,不可重入函数在执行过程中如果被打断,函数执行的状态就会丢失。当系统重新调度到该线程执行时,函数执行的输出就会出现偏差或失败。
在C语言的库函数中有非常多的不可重入函数,其中malloc和free函数就时典型的不可重入函数。对于嵌入时单片机系统,即使不带操作系统的软件系统也是一个多线程的系统。因为,一个中断处理逻辑也是一个执行线程,它随时都会打断主循环的执行。所有在单片机的系统编程的过程中一定要处理好有些不可重入函数的线程同步,否则将产生不可预知的错误和问题。
3. 问题的描述
下面的问题是由于在临界区保护时没有成对的使用加锁和解锁导致的死锁问题。请看下面一段代码:
char*