セマフォを使った同期制御における「生産者/消費者問題(Producer-Consumer Problem)」は、複数のスレッドやプロセスが共有資源(バッファなど)を安全にやり取りするための典型的な問題です。以下に、セマフォを用いた具体例を挙げて解説します。
【具体例】パン屋とお客の関係
状況:
パン屋(生産者)がパンを焼いてカゴ(バッファ)に入れる。
お客(消費者)がそのカゴからパンを1つ取っていく。
カゴには最大5個までパンを入れられる(バッファサイズ = 5)。
パン屋はカゴがいっぱいなら待機しなければならない。
お客はカゴが空なら待たなければならない。
【使用するセマフォと変数】
| 名前 | 役割 |
|---|
mutex | バッファ操作の排他制御(初期値1) |
empty | 空きスロット数(初期値5) |
full | パンの数(初期値0) |
buffer[] | パンの入るカゴ(配列で表現) |
【擬似コード】
生産者(パン屋)
while (true) { produce_item(); // パンを焼く wait(empty); // 空きスロットがあるか確認 wait(mutex); // 排他ロック add_item_to_buffer(); // カゴにパンを入れる signal(mutex); // 排他ロック解除 signal(full); // パンの数を1増やす}
消費者(お客)
while (true) { wait(full); // パンがあるか確認 wait(mutex); // 排他ロック remove_item_from_buffer(); // パンを取る signal(mutex); // 排他ロック解除 signal(empty); // 空きスロットを1増やす consume_item(); // パンを食べる}
【この例が示すポイント】
【現実での応用例】
この記事へのコメント