生産者消費者問題
#OS #用語
hr.icon
生産者がデータを入れ、消費者がデータを取り出す共有キューを、競合しないように安全に扱いたい
code: 条件.txt
キューを同時に操作して壊さない
キューが空なら、消費者は取り出さずに待つ
キューが満杯なら、生産者は追加せずに待つ
セマフォ
mutex: キューを操作するための排他制御,初期値1
empty: 空きスロット数,初期値MAX
full: データが入っているスロット数,初期値0
を使う
code: 生産者側
P(empty) // 空きがなければ待つ
P(mutex) // キューを操作するためにロック
キューにデータを追加
V(mutex) // ロック解除
V(full) // データ数を1つ増やす
code: 消費者側
P(full) // データがなければ待つ
P(mutex) // キューを操作するためにロック
キューからデータを取り出す
V(mutex) // ロック解除
V(empty) // 空き数を1つ増やす
モニタ
キューとキューを操作する関数を1つのまとまりとして管理
code: 擬似コード
monitor Buffer {
キュー
put(x) {
満杯なら待つ
キューに追加
空待ちの消費者を起こす
}
get() {
空なら待つ
キューから取り出す
満杯待ちの生産者を起こす
}
}
code: Java風
class Buffer {
private int[] queue = new intMAX;
private int count = 0;
public synchronized void put(int value) throws InterruptedException {
while (count == MAX) {
wait(); // 満杯なら生産者は待つ
}
// キューに値を追加する処理
count++;
notifyAll(); // 待っている消費者を起こす
}
public synchronized int get() throws InterruptedException {
while (count == 0) {
wait(); // 空なら消費者は待つ
}
// キューから値を取り出す処理
count--;
notifyAll(); // 待っている生産者を起こす
return 0;
}
}