某读者优先算法使用 mutex 保护 readCount,使用 rw 实现读者组与写者互斥。读者进入时 readCount 加 1,离开时减 1。正确的操作是()。
多个读者可以并发读,因此把全部活跃读者看成一个整体。第一个读者负责占用 rw,阻止写者进入;中间读者无需重复占用。最后一个读者离开时释放 rw,让等待写者有机会执行。
选项分析
错误。若 rw 是二值信号量,第二个读者会被第一个读者阻塞,失去并发读的意义。
正确。首读者代表读者组占用共享资源,末读者代表读者组释放资源。
错误。P 是申请或等待,V 是释放,方向写反。
错误。rw 的核心就是协调读者组和写者对共享数据的互斥访问。
本题为什么容易错
题目看似在考背代码,其实是在考两层互斥。readCount 是小临界区,数据读写是大临界区;锁的对象不同,操作位置自然不同。
简短答案
读者优先算法中,为什么第一个读者加锁、最后一个读者解锁,正确答案是 B(第一个读者进入时 P(rw),最后一个读者离开时 V(rw))。多个读者可以并发读,因此把全部活跃读者看成一个整体。第一个读者负责占用 rw,阻止写者进入;中间读者无需重复占用。最后一个读者离开时释放 rw,让等待写者有机会执行。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 每个读者进入都 P(rw),离开都 V(rw) | 本题干扰项 | 错误。若 rw 是二值信号量,第二个读者会被第一个读者阻塞,失去并发读的意义。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 第一个读者进入时 P(rw),最后一个读者离开时 V(rw) | 本题正确答案 | 正确。首读者代表读者组占用共享资源,末读者代表读者组释放资源。 | 看到题干核心场景时优先联想到它 |
| 第一个读者进入时 V(rw),最后一个读者离开时 P(rw) | 本题干扰项 | 错误。P 是申请或等待,V 是释放,方向写反。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 读者只操作 mutex,rw 只由两个写者之间使用 | 本题干扰项 | 错误。rw 的核心就是协调读者组和写者对共享数据的互斥访问。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 每个读者进入都 P(rw),离开都 V(rw):错误。若 rw 是二值信号量,第二个读者会被第一个读者阻塞,失去并发读的意义。
- 第一个读者进入时 V(rw),最后一个读者离开时 P(rw):错误。P 是申请或等待,V 是释放,方向写反。
- 读者只操作 mutex,rw 只由两个写者之间使用:错误。rw 的核心就是协调读者组和写者对共享数据的互斥访问。
知识点详解
经典读者优先方案允许已有读者持续带入新读者,因此吞吐量高但可能让写者等待过久。公平实现通常增加排队或闸门机制,避免后来读者越过已等待写者。考试若只给经典 readCount、mutex、rw 结构,通常按首读者上锁、末读者解锁判断。实际实现还需保证异常退出时信号量能够成对释放。
备考速记
首读锁住写者,末读放走写者;计数另用小锁保护。
PV 操作 在进程同步场景中的作用
PV 操作在本题中的核心价值,是解决“某读者优先算法使用 mutex 保护 readCount,使用 rw 实现读者组与写者互斥。读者进入时 readCount 加 1,离开时减 1。正确的操作是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 补全第一个读者和最后一个读者的 PV 操作。
- 判断计数器互斥信号量与资源互斥信号量的职责。
PV 操作 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把PV 操作放到进程同步场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
把阅览室里的所有读者当成一组。第一个人进门时把“写作中”牌子翻成“阅读中”,之后来的读者可以一起看;直到最后一个读者离开,才把牌子翻回来。readCount 的加减也会被并发访问,所以要用 mutex 短暂保护,但不能拿着 mutex 完成长时间读操作,否则读者之间也串行了。
考点定位
mutex 保护计数器本身,rw 保护共享数据。不要把“修改 readCount 的互斥”和“读者组与写者的互斥”混成一把锁的同一用途。
易错提醒
- 修改 readCount 时没有加 mutex,导致首尾判断出现竞态。
- 读者拿着 mutex 执行整个读取过程,使并发读退化为串行。
- 只考虑读者优先的正确性,没有意识到写者可能长期饥饿。
备考提示
- 在伪代码旁标注每个信号量保护的对象,而不是只背 P、V 顺序。
- 继续比较读者优先、写者优先和公平方案各自可能出现的饥饿问题。
你可能还想了解
- 读者写者问题中 mutex 和 rw 分别保护什么?
- 读者优先为什么可能让写者饥饿?
- 多个读者怎样做到并发访问?
本文小结
读者组共同占用共享资源:第一个读者P(rw)阻止写者,最后一个读者V(rw)释放写者;mutex只短暂保护readCount的并发修改,不能把整个读取过程锁成串行。