第二章 經典同步問題1 生產者消費者 讀者寫者

2021-07-24 05:30:00 字數 1600 閱讀 9365

通過訊號量的操作來完成經典同步問題。

1、生產者-消費者問題(北郵自主命題2023年考過,可能17年不考)

描述:

*一組生產者生產產品,一組消費者消費產品

*同一時間只能有乙個生產者或消費者訪問緩衝池

*當緩衝池滿,生產值阻塞,緩衝池空,消費者阻塞

實現方法

semaphore full=0;   //滿緩衝區數目

semaphore empty=n; //空緩衝區數目

semaphore mutex=1;

producter()

}consumer()

}

在生產者消費者問題上,p操作是不能替換順序的(可能導致死鎖),v可以。大題的原則是一定要先對資源訊號量進行p操作,在對互斥訊號量進行p操作。

2、讀者-寫者問題(2023年考試可能性很大)

描述

*任意時刻多個讀者可以同時讀檔案

*任意時刻只能有乙個寫者寫檔案

*寫操作時不能讀,讀操作時不能寫

這個問題呢,分多種情況實現,讀者優先、公平情況和寫者優先,其實懂了精髓的話,這幾個的差別是比較微小的。

(1)讀優先

semaphore rmutex=1;

semaphore mutex=1;

semaphore readcount=0;

reader()

}writer()

}

(2)公平情況演算法(按到達順序操作)

程序執行順序完全按照到達順序,乙個讀者進行讀操作時,如果有乙個寫者正在寫或者再等,這個讀者排在他後面。

需要增設乙個訊號量wmutex,初值為1,表示是否存在正在寫或者在等的寫者,存在則禁止讀者進入。

semaphore mutex=1;

semaphore rmutex=1; //用於讀者互斥訪問readcount

semaphore wmutex=1; //用於寫者互斥訪問readcount

int readcount;

reader()

}

(3)寫者優先

寫者可以插隊到讀者佇列之前,無論寫者是什麼時候來的。

這裡呢,需要再增加乙個訊號量readable,控制寫者到達時有限進入臨界區。

semaphore mutex=1;                  //控制互斥訪問資料區

semaphore rmutex=1; //用於讀者互斥訪問readcount

semaphore wmutex=1; //用於寫者互斥訪問readcount

semaphore readable=1; //表示當前是否有寫者

int readcount=0,writecount=0; //記錄讀者和寫者的數量

reader()

writer()

經典同步問題一 生產者和消費者問題

系列同步問題 經典同步問題一 生產者和消費者問題 經典同步問題二 哲學家進餐問題 經典同步問題三 讀者寫者問題 不懂得結構型訊號量的小夥伴可參考下面博文,之後再閱讀本博文,更易於理解 乙個或多個生產者產生資料並放在緩衝區中,每次乙個。乙個或多個消費者從緩衝區取資料項並消費,每次乙個。條件 1 在任意...

6 1 生產者 消費者問題

在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...

程序間同步互斥經典問題 一 生產者 消費者問題

生產者 消費者問題,也叫做快取繫結問題 bounded buffer 是乙個多程序同步問題。要避免多個生產商競爭乙個空位的情況。要避免生產商和消費者同時睡覺,造成死鎖 要避免多個消費者競爭同一段資料的情況 首先考慮生產商,在多個生產商和多個消費者同時執行的情況下 2.每乙個生產商在執行操作前申請互斥...