web-dev-qa-db-ja.com

睡眠理髪師の問題(複数の理髪師)

眠っている理髪師の問題 は、多くの人がよく知っている、または少なくとも聞いたことのある古典的な同期問題です。

これは、待合室(セマフォ)に顧客がいない(各顧客がスレッドである)ときに床屋(スレッド)が眠るという前提に基づいています。誰かがいる場合、彼は髪を切り(処理を象徴する)し、貸衣装をします。待合室に誰もいなければ床屋は寝ます。別の顧客が到着すると、彼は理髪店を起こさなければなりません。

私は次の基本的なアイデアを使用してこれを実装しました(疑似コード、sem_waitsem_postのみを使用して1 スムーズに読むために)

Semaphore Customers = 0;
Semaphore Barber = 0;
Mutex accessSeats = 1;
int NumberOfFreeSeats = N; 

Barber {
    while(1) {
        sem_wait(Customers) // waits for a customer (sleeps)
        sem_wait(accessSeats) // mutex to protect the number of available seats
        NumberOfFreeSeats++ // a chair gets free
        sem_post(Barber) // bring customer for haircut
        sem_post(accessSeats) // release the mutex on the chair
        // barber is cutting hair
    }
}

Customer {
    while(1) {
        sem_wait(accessSeats) // protects seats so only 1 thread tries to sit in a chair if that's the case
        if(NumberOfFreeSeats > 0) {
            NumberOfFreeSeats-- // sitting down
            sem_post(Customers) // notify the barber
            sem_post(accessSeats) // release the lock
            sem_wait(Barber) // wait in the waiting room if barber is busy
            // customer is having hair cut
        } else {
            sem_post(accessSeats) // release the lock
            // customer leaves
        }
   }
}

しかし、この問題を複数の床屋で実装するようになったので、頭が動けなくなりました。ウィキペディアで何か見つけられるか調べに行ったのですが、見つけたのはこれだけでした

複数の床屋の問題は、待機中の顧客の間でいくつかの床屋を調整するという複雑さをさらに持っています。

そして私はこれを自分で理解することができませんでした。どの場合、私はこの複雑さを持っているでしょうか?数人の理髪店が待合室に行ってそこに誰かいるかどうかを確認し、1人の顧客を(複数の理髪店に)連れて行きますか?ここに追加のセマフォが必要ですか?

1sem_wait()はセマフォをロックします。 sem_post()がロックを解除します

6
user2018675

1つの床屋で、必要なのはメッセージキュー(待合室)だけです。セマフォが埋め込まれています。

複数の理髪店で、調整は以下を目的としています:

  • 複数の理髪師が同じ顧客の髪を切るのを防ぎます。

  • 他の人が一日中眠っている間、忙しい床屋が1人だけになるのを防ぎます。

2
mouviciel