rw=1(读写互斥)、mutex=1(保护 count)、count(读者数)。读者优先可能饿死写者。多个读者和写者共享一个文件(数据库):
| 名称 | 初值 | 含义 |
|---|---|---|
rw | 1 | 读写互斥信号量 |
mutex | 1 | 保护 count 变量 |
count | 0 | 当前正在读的读者数 |
读者优先方案(写者可能饥饿):
写者:P(rw); 写文件; V(rw)
读者:P(mutex); count++; if(count==1) P(rw); V(mutex);
读文件;
P(mutex); count--; if(count==0) V(rw); V(mutex)
写者优先方案:增加信号量 w=1,写者到来时先 P(w) 阻止新读者进入,避免写者饥饿。
| 特性 | 读者优先 | 写者优先 |
|---|---|---|
| 读者并发 | 高,可能无限加入 | 受限,写者等待时新读者阻塞 |
| 写者饥饿 | 可能 | 不会 |
| 信号量数量 | 2 + count | 3 + count |
读者优先,初始 $rw=1, mutex=1, count=0$,到达顺序 R1, R2, W1, R3:
| 步骤 | 操作 | rw | mutex | count | 说明 |
|---|---|---|---|---|---|
| 1–4 | R1 加锁文件 | 0 | 1 | 1 | 第一个读者锁 rw |
| 6–9 | R2 加入 | 0 | 1 | 2 | R1、R2 同时读 |
| 10 | W1 P(rw) | -1 | 1 | 2 | W1 阻塞 |
| 11–13 | R3 也能加入 | -1 | 1 | 3 | R3 开始读 |
写者 W1 被读者们"饿"住——这就是读者优先的饥饿问题。
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。