8.3 經典進程同步問題-讀寫者問題

問題描述

有讀者和寫者兩組并發進程,共享一個文件,當兩個或以上的讀進程同時訪問共享數據時不會產生副作用,但若某個寫進程和其他進程(讀進程或寫進程)同時訪問共享數據時則可能導致數據不一致的錯誤。因此要求:

  • 允許多個讀者可以同時對文件執行讀操作;
  • 只允許一個寫者往文件中寫信息;
  • 任一寫者在完成寫操作之前不允許其他讀者或寫者工作;
  • 寫者執行寫操作前,應讓已有的讀者和寫者全部退出。

問題分析

  1. 關系分析。由題目分析讀者和寫者是互斥的,寫者和寫者也是互斥的,而讀者和讀者不存在互斥問題。

  2. 整理思路。兩個進程,即讀者和寫者。寫者是比較簡單的,它和任何進程互斥,用互斥信號量的P操作、V操作即可解決。讀者的問題比較復雜,它必須實現與寫者互斥的同時還要實現與其他讀者的同步,因此,僅僅簡單的一對P操作、V操作是無法解決的。那么,在這里用到了一個計數器,用它來判斷當前是否有讀者讀文件。當有讀者的時候寫者是無法寫文件的,此時讀者會一直占用文件,當沒有讀者的時候寫者才可以寫文件。同時這里不同讀者對計數器的訪問也應該是互斥的。

  3. 信號量設置。首先設置信號量count為計數器,用來記錄當前讀者數量,初值為0; 設置mutex為互斥信號量,用于保護更新count變量時的互斥;設置互斥信號量rw用于保證讀者和寫者的互斥訪問。

讀進程優先解決方案

當存在讀進程時,寫操作將被延遲,并且只要有一個讀進程活躍,隨后而來的讀進程都將被允許訪問文件。描述如下:

int count=0;  //用于記錄當前的讀者數量
semaphore mutex=1;  //用于保護更新count變量時的互斥
semaphore rw=1;  //用于保證讀者和寫者互斥地訪問文件
writer () {  //寫者進程
    while (1){
        P(rw); // 互斥訪問共享文件
        Writing;  //寫入
        V(rw) ;  //釋放共享文件
    }
}

reader () {  // 讀者進程
    while(1){
        P (mutex) ;  //互斥訪問count變量
        if (count==0)  //當第一個讀進程讀共享文件時
            P(rw);  //阻止寫進程寫
        count++;  //讀者計數器加1
        V (mutex) ;  //釋放互斥變量count
        reading;  //讀取
        P (mutex) ;  //互斥訪問count變量
        count--; //讀者計數器減1
        if (count==0)  //當最后一個讀進程讀完共享文件
            V(rw) ;  //允許寫進程寫
        V (mutex) ;  //釋放互斥變量 count
    }
}

寫進程優先解決方案

讀進程優先解決方案會導致寫進程可能長時間等待,且存在寫進程“餓死”的情況。下面描述寫進程有限解決方案:

int count = 0;  //用于記錄當前的讀者數量
semaphore mutex = 1;  //用于保護更新count變量時的互斥
semaphore rw=1;  //用于保證讀者和寫者互斥地訪問文件
semaphore w=1;  //用于實現“寫優先”

writer(){
    while(1){
        P(w);  //在無寫進程請求時進入
        P(rw);  //互斥訪問共享文件
        writing;  //寫入
        V(rw);  // 釋放共享文件
        V(w) ;  //恢復對共享支件的訪問
    }
}

reader () {  //讀者進程
    while (1){
        P (w) ;  // 在無寫進程請求時進入
        P (mutex);  // 互斥訪問count變量

        if (count==0)  //當第一個讀進程讀共享文件時
            P(rw);  //阻止寫進程寫

        count++;  //讀者計數器加1
        V (mutex) ;  //釋放互斥變量count
        V(w);  //恢復對共享文件的訪問
        reading;  //讀取
        P (mutex) ; //互斥訪問count變量
        count--;  //讀者計數器減1

        if (count==0)  //當最后一個讀進程讀完共享文件
            V(rw);  //允許寫進程寫

        V (mutex);  //釋放互斥變量count
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容