多個讀者進程與寫者進程共享一塊資源(如黑板)。約束條件:
| 變量 | 初值 | 用途 |
|---|---|---|
| mutex | 1 | 保護共享資源(黑板)的互斥訪問 |
| reader_mutex | 1 | 保護讀者計數器 r_count 的原子操作 |
| r_count | 0 | 當前正在讀取的讀者數量 |
while (true) {
P(reader_mutex); // 進入計數器臨界區
r_count++;
if (r_count == 1) // 第一個讀者
P(mutex); // 佔用資源,阻止寫者
V(reader_mutex); // 釋放計數器鎖
read(); // 執行讀操作(並發安全)
P(reader_mutex); // 離開計數器臨界區
r_count--;
if (r_count == 0) // 最後一個讀者離開
V(mutex); // 釋放資源,喚醒寫者
V(reader_mutex);
}
while (true) {
P(mutex); // 直接申請資源互斥鎖
write(); // 獨佔寫入
V(mutex); // 釋放資源
}
reader_mutex 保護計數器,mutex 保護資源本體。mutex,實現讀者並發。若改為寫者優先,需引入 w_count(等待寫者數)與 write_mutex,讀者進入前檢查是否有寫者等待。更通用的解法是使用讀寫鎖,現代線程庫均已內建高效實現。