首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

經典作業系統問題:讀者-寫者問題(讀者優先)的信號量實現

     編輯:關於C語言

問題描述

多個讀者進程與寫者進程共享一塊資源(如黑板)。約束條件:

  • 多個讀者可同時讀取;
  • 寫者必須獨佔訪問;
  • 讀者與寫者不能同時訪問;
  • 讀者優先:只有當無讀者時,寫者才能進入。

同步變量定義

變量初值用途
mutex1保護共享資源(黑板)的互斥訪問
reader_mutex1保護讀者計數器 r_count 的原子操作
r_count0當前正在讀取的讀者數量

進程邏輯實現

讀者進程

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);                 // 釋放資源
}

關鍵點解析

  1. 雙重互斥:reader_mutex 保護計數器,mutex 保護資源本體。
  2. 首尾責任制:第一個讀者獲取資源鎖,最後一個讀者釋放資源鎖,中間讀者無需操作 mutex,實現讀者並發。
  3. 飢餓風險:持續有讀者到達會導致寫者長期等待(寫者飢餓),實際系統常引入「寫者優先」或公平隊列改進。

擴展思考

若改為寫者優先,需引入 w_count(等待寫者數)與 write_mutex,讀者進入前檢查是否有寫者等待。更通用的解法是使用讀寫鎖,現代線程庫均已內建高效實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved