有界缓冲区使用信号量 empty 表示空槽数、full 表示产品数、mutex 表示互斥访问。生产者放入一个产品时,合理的操作顺序是()。
生产者先对 empty 执行 P,确认有空槽;再对 mutex 执行 P,独占缓冲区并放入产品。离开临界区后先释放 mutex,再对 full 执行 V,通知产品数增加。这样既满足同步关系,也避免在持有互斥锁时等待空槽。
选项分析
错误。先获得mutex再等待empty,缓冲区满时生产者可能持锁阻塞,使消费者无法进入临界区腾出空槽。
正确。先等待空槽,再互斥修改缓冲区,完成后释放锁并增加full。
错误。生产者应等待empty而不是full;该顺序更接近消费者但计数更新也不对应。
错误。P与V方向和临界区边界都颠倒,不能保证同步与互斥。
本题为什么容易错
很多人认为“互斥锁越早拿越安全”,却忽略了拿锁后可能在另一个信号量上阻塞。锁保护的是实际读写缓冲区的短临界区,不应该包住可能长时间等待资源的步骤。
简短答案
生产者为什么要先申请空缓冲区,再进入互斥区,正确答案是 B(P(empty)→P(mutex)→放入→V(mutex)→V(full))。生产者先对 empty 执行 P,确认有空槽;再对 mutex 执行 P,独占缓冲区并放入产品。离开临界区后先释放 mutex,再对 full 执行 V,通知产品数增加。这样既满足同步关系,也避免在持有互斥锁时等待空槽。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| P(mutex)→P(empty)→放入→V(full)→V(mutex) | 本题干扰项 | 错误。先获得mutex再等待empty,缓冲区满时生产者可能持锁阻塞,使消费者无法进入临界区腾出空槽。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| P(empty)→P(mutex)→放入→V(mutex)→V(full) | 本题正确答案 | 正确。先等待空槽,再互斥修改缓冲区,完成后释放锁并增加full。 | 看到题干核心场景时优先联想到它 |
| P(full)→P(mutex)→放入→V(mutex)→V(empty) | 本题干扰项 | 错误。生产者应等待empty而不是full;该顺序更接近消费者但计数更新也不对应。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| V(empty)→V(mutex)→放入→P(mutex)→P(full) | 本题干扰项 | 错误。P与V方向和临界区边界都颠倒,不能保证同步与互斥。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- P(mutex)→P(empty)→放入→V(full)→V(mutex):错误。先获得mutex再等待empty,缓冲区满时生产者可能持锁阻塞,使消费者无法进入临界区腾出空槽。
- P(full)→P(mutex)→放入→V(mutex)→V(empty):错误。生产者应等待empty而不是full;该顺序更接近消费者但计数更新也不对应。
- V(empty)→V(mutex)→放入→P(mutex)→P(full):错误。P与V方向和临界区边界都颠倒,不能保证同步与互斥。
知识点详解
empty 初值通常为缓冲区容量 N,full 初值为0,mutex初值为1。计数信号量解决生产者与消费者的同步,mutex保护缓冲区读写的互斥。P操作可能阻塞,因此通常先等待计数资源,再进入互斥区;V(mutex)与V(full)在许多实现中即使顺序不同未必立即错误,但先尽快释放互斥锁更利于并发。
备考速记
生产先要空位再上锁,结束先开锁再报有货。
PV操作 在互斥同步场景中的作用
PV操作在本题中的核心价值,是解决“有界缓冲区使用信号量 empty 表示空槽数、full 表示产品数、mutex 表示互斥访问。生产者放入一个产品时,合理的操作顺序是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 补全生产者或消费者程序中的P/V操作。
- 判断某种P操作顺序是否可能导致死锁。
- 给定多个生产者消费者,分析mutex、empty、full的初值。
PV操作 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把PV操作放到互斥同步场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
先问有没有空位,再进仓库上锁,是安全顺序。若先把仓库门锁上,再发现没有空位而睡眠,消费者即使想进来取走产品、腾出空位,也拿不到锁,双方就僵住了。
考点定位
生产者顺序为 P(empty)、P(mutex)、生产、V(mutex)、V(full);消费者将 empty 与 full 对调。资源计数信号量应在互斥锁外等待,避免持锁阻塞。
易错提醒
- 把empty和full的含义背反:生产者消耗空槽、增加产品。
- 先P(mutex)再P(empty),制造持锁等待。
- 放入产品后忘记V(full),导致消费者一直认为没有产品。
备考提示
- 不要死背五步,先写资源变化:生产前需要一个empty,生产后产生一个full。
- 消费者流程照镜子:P(full)、P(mutex)、取出、V(mutex)、V(empty)。
你可能还想了解
- empty、full、mutex的初值分别是什么?
- 为什么不能先P(mutex)再P(empty)?
- 消费者的PV操作顺序怎么写?
- V(mutex)和V(full)的顺序能否交换?
本文小结
生产者先P(empty)申请空槽,再P(mutex)进入临界区;放入产品后V(mutex)释放锁,最后V(full)通知产品增加。先锁mutex再等empty可能形成持锁阻塞。