使用訊號量的生產者消費者問題
生產者消費者問題是一個同步問題。存在一個固定大小的緩衝區,生產者產生專案並將它們放入緩衝區。消費者從緩衝區中移除專案並消耗它們。
當消費者從緩衝區中消耗專案時,生產者不應該將專案放入緩衝區,反之亦然。因此,緩衝區一次只能被生產者或消費者訪問。
生產者消費者問題可以使用訊號量來解決。生產者和消費者程序的程式碼如下所示:
生產者程序
定義生產者程序的程式碼如下所示:
do {
.
. PRODUCE ITEM
.
wait(empty);
wait(mutex);
.
. PUT ITEM IN BUFFER
.
signal(mutex);
signal(full);
} while(1);在上面的程式碼中,mutex、empty 和 full 是訊號量。這裡 mutex 初始化為 1,empty 初始化為 n(緩衝區的最大大小),full 初始化為 0。
mutex 訊號量確保互斥。empty 和 full 訊號量計算緩衝區中空閒空間和已滿空間的數量。
在產生專案後,對 empty 進行 wait 操作。這表示緩衝區中的空閒空間減少了 1。然後對 mutex 進行 wait 操作,以便消費者程序無法干擾。
將專案放入緩衝區後,對 mutex 和 full 進行 signal 操作。前者表示消費者程序現在可以執行操作,後者表示緩衝區已滿 1。
消費者程序
定義消費者程序的程式碼如下所示
do {
wait(full);
wait(mutex);
. .
. REMOVE ITEM FROM BUFFER
.
signal(mutex);
signal(empty);
.
. CONSUME ITEM
.
} while(1);對 full 進行 wait 操作。這表示緩衝區中的專案減少了 1。然後對 mutex 進行 wait 操作,以便生產者程序無法干擾。
然後從緩衝區中移除專案。之後,對 mutex 和 empty 進行 signal 操作。前者表示消費者程序現在可以執行操作,後者表示緩衝區中的空閒空間增加了 1。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP