软件设计师 · 高频练习

读者优先算法中,为什么第一个读者加锁、最后一个读者解锁?

中级 单选题 第 911 题 中等 软件设计师读者写者问题PV 操作信号量进程同步
题目

某读者优先算法使用 mutex 保护 readCount,使用 rw 实现读者组与写者互斥。读者进入时 readCount 加 1,离开时减 1。正确的操作是()。

A 每个读者进入都 P(rw),离开都 V(rw)
B 第一个读者进入时 P(rw),最后一个读者离开时 V(rw)
C 第一个读者进入时 V(rw),最后一个读者离开时 P(rw)
D 读者只操作 mutex,rw 只由两个写者之间使用
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

多个读者可以并发读,因此把全部活跃读者看成一个整体。第一个读者负责占用 rw,阻止写者进入;中间读者无需重复占用。最后一个读者离开时释放 rw,让等待写者有机会执行。

选项分析

A

错误。若 rw 是二值信号量,第二个读者会被第一个读者阻塞,失去并发读的意义。

B

正确。首读者代表读者组占用共享资源,末读者代表读者组释放资源。

C

错误。P 是申请或等待,V 是释放,方向写反。

D

错误。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的并发修改,不能把整个读取过程锁成串行。