通過訊號量的操作來完成經典同步問題。
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.每乙個生產商在執行操作前申請互斥...