锁
下⾯列出了⼀些导致锁出现不正确⾏为的原因,以及锁在不正确运⾏时的症状:
- 持有锁的进程因为操作时间过长⽽导致锁被⾃动释放,但进程本⾝并不知晓这⼀点,甚⾄还可能会错误地释放掉了其他进程持有的锁。
- ⼀个持有锁并打算执⾏长时间操作的进程已经崩溃,但其他想要获取锁的进程不知道哪个进程持有着锁,也⽆法检测出持有锁的进程已经崩溃,只能⽩⽩地浪费时间等待锁被释放。
- 在⼀个进程持有的锁过期之后,其他多个进程同时尝试去获取锁,并且都获得了锁。
- 上⾯提到的第⼀种情况和第三种情况同时出现,导致有多个进程获得了锁,⽽每个进程都以为⾃⼰是唯⼀⼀个获得锁的进程。
信号量实现的优缺点
- 如果你对于使⽤系统时钟没有意见,也不需要对信号量进⾏刷新,并且能够接受信号量的数量偶尔超过限制,那么可以使⽤我们给出的第⼀个信号量实现
- 如果你只信任差距在⼀两秒之间的系统时钟,但仍然能够接受信号量的数量偶尔超过限制,那么可以使⽤第⼆个信号量实现。
- 如果你希望信号量⼀直都具有正确的⾏为,那么可以使⽤带锁的信号量实现来保证正确性。
任务队列
在队列领域中,除了任务队列之外,其他⼏种不同的队列也常常会被⼈谈起——⽐如先进先出(FIFO)队列、后进先出(LIFO)队列和优先级(priority)队列。