2

次の質問をされましたが、どれが正解かわかりません。

If monitors are implemented by replacing condition variables with semaphores 
(counters set to 0) with down() and up() as wait and signal, respectively,
would the monitors work correctly?

セマフォと条件変数は互いに置き換えることができるため、正しい実装であると言いたくなるでしょうね。より良い説明はありますか?

4

1 に答える 1

3

バイナリ セマフォとも呼ばれる 1 に初期化されたセマフォについて質問しています。

答えは、これらのプリミティブの特定の実装 (または定義) によって異なりますが、典型的な違いは、モニターにはスレッドの所有権があり、セマフォにはないことです。これは、さまざまなシナリオに影響を与えます。

  • セマフォの場合、1 つのスレッドがすべてのアップを行い、別のスレッドがすべてのダウンを行うのは完全に正常です。これはモニターによって許可されるべきではありません。
  • プライベート状態と複数のパブリック メソッドを持つクラスがあり、そのすべてがその状態を保護するために、エントリ時に共通のモニターをロックし、終了時にロックを解除するとします。また、パブリック メソッドAが内部的にパブリック メソッドを呼び出すとしますB。次に、再帰モニターはメソッドの呼び出しを正しく許可しますがA(これには、ロック-ロック-ロック解除-ロック解除のシーケンスが含まれます)、セマフォ実装モニターの場合は、同じスレッドを使用して 2 回目のロック試行でデッドロックが発生します。
  • スレッドが名前付きのシステム全体のモニターを取得してクラッシュしたとします。スレッドの所有権により、モニターを自動的にロック解除し、待機中のスレッドがモニターを取得できるようにすることができます。バイナリ セマフォではこれは不可能であり、このような状況は通常、再起動するまで満足のいく解決はありません。[編集:ミューテックスの場合でも、保護されたリソースまたはデータ構造の状態は、途中でクラッシュした後は基本的に定義されていないため、説明されている回復メカニズムは望ましくないか、デフォルトで有効になっていない可能性があることに注意してください。通常、再取得するか別の方法で回復するかの決定は、アプリケーション コードに委ねられます。]

したがって、バイナリ セマフォはモニターに似ていますが、同じように動作するとは思わないでください。

于 2012-04-20T20:43:16.273 に答える