セマフォを使った同期制御における生産者/消費者問題の具体例を挙げてください

kirill-sh-eVWWr6nmDf8-unsplash.jpg

質問

セマフォを使った同期制御における生産者/消費者問題の具体例を挙げてください


解答

セマフォを使った同期制御における「生産者/消費者問題(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();              // パンを食べる}

【この例が示すポイント】

  • 同期制御の必要性:同時に複数のスレッドがバッファを操作するとデータ破壊が起きる。セマフォによりそれを防ぐ。

  • セマフォの役割

    • empty → 空きスペースの数を管理(生産者が待機するために使用)

    • full → 現在のアイテム数を管理(消費者が待機するために使用)

    • mutex → クリティカルセクションの排他制御(バッファ操作)


【現実での応用例】

  • プリントジョブキュー(プリンタが生産者、ユーザーが消費者)

  • メール送信バッファ

  • OSのパイプ処理やスレッド間通信(IPC)





アルゴリズム実技検定 公式テキスト[エントリー〜中級編] [ 岩下 真也 ]

価格:3828円
(2025/6/20 11:44時点)
感想(0件)


WEB DB PRESS Vol.116【電子書籍】[ WEB DB PRESS編集部【編】 ]

価格:1628円
(2023/11/14 12:46時点)
感想(0件)


 



この記事へのコメント

広告です。クリックいただけると励みになります。