2009-05-07 8 views
2

モニターは、並行環境でのセマフォーの問題を解決するはずです。
私はモニターのセマフォーを使って良いアナロジーを探しています。

類推のための情報を使用してください:
4タスク(TaskA、TaskB、TaskC、TaskD)
1変数 VARX
モニターのための良い例/例を探しているセマフォー

の各タスクには、いくつかのイベントに基づいて VARXを操作したいと考えています。

答えて

6

多くの患者さんが医者に行きたいと言っています。

セマフォの実装は、すべてがオフィスのドアの外に立つでしょう。一人の患者が出てくるとすぐに、彼らはすべて握り締めようとします。一人は入ることができ、残りはもう一度待たなければなりません。

モニターの実装は、すべての入室患者が待合室に送られる代わりに、注文の一部が決定され、1人の患者が完了すると、別の患者が医師に送られます。

これらは基本的に同じものですが、モニターはセマフォよりもはるかに構造化されています。

+0

私はこれまで、あなたの類推が好きです。 – mrwes

+2

あるいは、セマフォーはドアのロックですが、モニターは部屋全体(ロックで管理)です。同じアイデア、異なる視点。 – Rhamphoryncus

1

リソースの競合をイベント通知から切り離すことが重要です。モニタとセマフォは、共有リソースへのアクセスを制限するために使用されます。

Monitor.Enter 
// do something with varX 
Monitor.Exit 

または

:モニターは、基本的にその数1である、あなたのタスクのそれぞれは、単一のVARXへのアクセスを取得したい場合は、あなたがお使いのモニタを使用して、それを保護する必要がセマフォ(または1のsempahore)であります
Semaphore.Acquire 
// do something with varX 
Semaphore.Release 

セマフォを使用すると、共有リソースに許可された同時参加者の参加者の数を明示的に設定できます。

ニック。

2

また、モニターを公共のトイレとして見ることもできます。閉鎖された便器のドアに誰かがいったん入ると、その人は誰もその空間にいないことを望む(すなわち、モニタ)。他のすべての人(スレッド)は、トイレの前に並んで待ってください(待ちます)。内部の人が終わった後で、それが出て来て、次の人が入ることができます。

待っている人の中には便秘の問題があるかもしれません。明白な理由から、彼らはトイレを適切に使用する準備ができていない限り、入ったり戻ったりしたくない。これは、トイレに行く準備ができていることを彼らの胃が(信号())知らせるまで待つ(待機する)場所です。これが起こる前に、彼らは誰もが通過できるようにします。

出典:www.mijnadres.net/published/Monitor%20Object%20Pattern.pdf

関連する問題