Appearance
题目
假设进程 P 的读、写进程集合分别是 R(P) 和 W(P),进程 Q 的读、写进程集合分别为 R(Q) 和 W(Q),则进程 P 和 Q 并发执行中,不会发生错误的并发执行充要条件是( )。
Ⅰ. R(Q)∩W(P)=∅ Ⅱ. R(P)∩R(Q)=∅ Ⅲ. W(P)∩W(Q)=∅ Ⅳ. R(P)∩W(Q)=∅
错因
A
把"读读"也当成了冲突。可能是数据库事务隔离级里的"读读相容、读写冲突、写写冲突"还没建立起来,或被"任何同时访问都要互斥"的笼统概念误导,把 Ⅱ()也当成必要条件。但两个进程同时读同一个变量不会改变它的值,结果一致——读读永远不冲突,Ⅱ 不需要成立。同时漏掉了 Ⅳ(写后读冲突),覆盖不全。
B
理解了"读读不冲突"以外的其他条件,但仍把 Ⅱ 当成必要——把"无干扰"过度解读为"完全无交集"。对并发安全来说真正要避免的只有"含写的两两访问",纯读不会引入数据竞争。Ⅱ 错;同时漏了 Ⅳ。
D
只考虑了"读写冲突"和"写写冲突"两类,但把"读"集合记错了:选 Ⅱ 而非 Ⅰ 和 Ⅳ。实际上 P 写到 Q 读、Q 写到 P 读这两类才是真正的"读写冲突"——而这分别对应 Ⅰ 和 Ⅳ;Ⅱ 是"两边都读",恰好是不冲突的那种。把读写冲突写成"两个读集合不相交"是典型的方向反置错误。
总解析
Bernstein 条件:进程 P 与 Q 可安全并发的充要条件是下面三组集合两两不相交:
| 冲突类型 | 不相交条件 | 物理含义 |
|---|---|---|
| 写后读(P 写 → Q 读同一变量) | 防止 Q 读到 P 写一半的脏数据 | |
| 读后写(Q 写 → P 读同一变量) | 防止 P 读到的值被 Q 偷换 | |
| 写写冲突(双方都写同一变量) | 防止两方写入互相覆盖、最终值不确定 |
唯一不需要的是"读读不相交"——两个进程同时读同一变量,谁也不会改它,互不影响。
对照题目四个选项:
- Ⅰ. → 等价于 ,写后读冲突 ✓
- Ⅱ. → "读读不相交",不必要 ✗
- Ⅲ. → 写写冲突 ✓
- Ⅳ. → 读后写冲突 ✓
需要同时满足的是 Ⅰ、Ⅲ、Ⅳ。
记忆口诀:"写写、读写、写读三冲突,读读相安无事"——三个含 W 的方向都要不相交,只剩 RR 不用管。
最终答案是 C。