使用訊號量的生產者消費者問題


生產者消費者問題是一個同步問題。存在一個固定大小的緩衝區,生產者產生專案並將它們放入緩衝區。消費者從緩衝區中移除專案並消耗它們。

當消費者從緩衝區中消耗專案時,生產者不應該將專案放入緩衝區,反之亦然。因此,緩衝區一次只能被生產者或消費者訪問。

生產者消費者問題可以使用訊號量來解決。生產者和消費者程序的程式碼如下所示:

生產者程序

定義生產者程序的程式碼如下所示:

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。

更新於: 2020年6月24日

27K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.