第四章 锁定和并发控制(四)
避免死锁
增量锁定具有潜在危险,因为它可能导致称为死锁的情况。当两个进程各自对已被另一个进程锁定的变量断言增量锁定时,就会出现这种情况。因为尝试的锁是增量的,所以现有的锁不会被释放。结果,每个进程在等待另一个进程释放现有锁的同时挂起。
举个例子:
- 进程
A发出此命令:lock + ^MyGlobal(15) - 进程
B发出此命令:lock + ^MyOtherGlobal(15) - 进程
A发出此命令:lock + ^MyOtherGlobal(15)
此 LOCK 命令不返回;进程被阻塞,直到进程 B 释放这个锁。
- 进程
B发出此命令:lock + ^MyGlobal(15)
此 LOCK 命令不返回;进程被阻塞,直到进程 A 释放这个锁。但是,进程 A 被阻塞,无法释放锁。现在这些进程都在等待对方。
有几种方法可以防止死锁:
- 始终包含
timeout参数。 - 对于发出增量
LOCK命令的顺序,请遵循严格的协议。只要所有进程都遵循相同的锁名称顺序,就不会发生死锁。一个简单的协议是按排序顺序添加锁。 - 使用简单锁定而不是增量锁定;也就是说,不要使用
+运算符。如前所述,对于简单锁定,LOCK命令首先释放进程持有的所有先前锁定。 (然而,在实践中,简单的锁定并不经常使用。
.png)
.png)

.png)

