在进行多线程执行过程中,对于共享资源的访问会出现不可知的异常。
临界区:临界区就是为了避免这种异常的发生,当一个线程进入临界区的时候,就定义一个标志,表示现在临界区正在被访问,其他线程只能等待。但是临界区的实现还是没有办法完全避免多个线程同时访问临界区而产生的异常。只是异常发生的概率会小很多。更进一步在临界区中使用中断来标志临界区是否可以访问来解决问题。就是线程进入临界区的时候首先访问中断是否可以用,如果可用,当前线程顺利进入临界区,然后将中断设置为不可用。这种方法可以避免异常,但是这里有个问题,就是通过用户程序使用中断的时候,会让很多程序暂停执行,如果用户程序执行时间过长或者一个死循环,其他线程将一直等待,不能执行任何操作。
锁:对于上面临界区使用中断引发的问题,提出了锁的概念,所谓锁就是操作系统提供一个接口功用户使用,当线程进入临界区的时候,先判断锁是否开着,进入后,将锁锁上,运行结束,将锁打开。这里的锁是操作系统定义的,是有操作系统使用中断来实现的,大概就是一个循环。
while(lock)
{
enableInterrupts();
disableInterrupts();
}
通过不停的打开中断和关闭中断来实现当前线程执行,并防止中断时间过长。
死锁:当两个线程都需要使用对方拥有的资源进行执行时,会发生死锁。