2010-11-21 10 views
1

セマフォsがあり、P(s)を呼び出してそれを待っているスレッドが複数あるとします。そして、V(s)はそれらの間で正確に1つのスレッドを起動する。システムが決定を下す代わりに、指定されたスレッドを起動する方法はありますか?例えば、理髪師の問題では、理髪師がそれぞれのヘアカットの後で、理髪師は無作為なものではなく最も長い待機顧客にサービスを提供したいと考えています。Vを使って指定されたPを起こす方法は?

+0

'language-agnostic'タグを無視します:' java.util.concurrent.Semaphore'は先入れ先出しを保証する 'fairNess'を持っています。しかし、これは答えではない。なぜなら、指定は別のパラメータに基づくかもしれないからである。 – khachik

答えて

1

Pを格納するためにキューを使用するだけで済みます。それはあなたが最も長い待ち時間に基づいてそれをさせるでしょう。そうでなければ、あなたが望むどんなパラメーターにも基づいてソートされたツリーに格納することができ、必要に応じて削除することができます。

私は、それが難しいとは限らないPのための何らかの並べ替えの仕組みになると思います。

1

セマフォの実装によって異なります。待機中のスレッドのキューを作成し、正しい順序で通知するスマートセマフォを使用する必要があります。私は、Windows上での通常のセマフォーの実装はそのようには動作しないと思います。これはOSに信号を送信するだけで、待機中のスレッドのいずれかに信号を送信します。それがより簡単に実装されるので、これがlifoスタックを使用するなら、それは理にかなっています。 しかし、リンクリストやサイクリック配列のようなキューを実装することで、これを自分で構築することは難しくありません。

1

いいえ、クラシックセマフォ自体ではありません。キューのような振る舞いをしたい場合は、キューの共有データ構造を保護するためにキューを作成します(セマフォを使用するか、またはそれらの組み合わせを使用します)。

実際には、セマフォーは理論的にはすべて同期化する必要がありますが、裸のセマフォーを直接使用した実体コードを書くことはめったにありません。ほとんどの場合、セマフォを使用して、その構造内の重要なデータを保護するために、より高いレベルの構造を構築します。

関連する問題