2

私はSemaphore奇妙なものを十分に使用していません...
とにかく、それを使用していくつかのコードを確認していたところ、ロックとは異なり、パーミットは別のスレッドによって解放されることがわかりました (つまり、所有権はありません)。
私が調べたところ、次のように書かれConcurrency in Actionています(p.98):

実装には実際の許可オブジェクトはありません....そのため、あるスレッドによって取得された許可は別のスレッドによって解放される可能性があります

私は以前にこの詳細に気付かなかったので、私が持っているOSの教科書を調べました(私の強調):

1 つのプロセスがセマフォ値を変更すると、他のプロセスは変更されません ....etc

では、これは Java 固有の設計上の決定ですか? つまり、セマフォはスレッドによって所有されていません。
または、セマフォの概念を誤解していますか?

注:これは、これが良い/悪い設計であるかどうかなどの問題ではありません。概念を理解していることを確認しようとしているだけです。

4

1 に答える 1

2

ウィキペディアによると、セマフォは取得/解放されたオブジェクトを追跡せず、数のみを追跡します。したがって、「所有権」はここでは適用されません。「重要な観察」のセクションを読んでください!

したがって、所有権はありません。この点で、Javaセマフォは正しいことをします。また、Unixセマフォ(semop(2)を参照)はこのように機能します。

ただし、一部の教科書では、「ミューテックス」、「ロック」、「セマフォ」という用語がかなり自由に混ざっているようです。そのテキストの品質は自分で判断できます。

編集:

Tannenbaumがセマフォとミューテックスを区別しないことを信じられなかったので、「1つのプロセスがセマフォ値を変更するとき[...]」の完全な引用を検索し、これにあるものを思いつきました(かどうかはわかりません)彼らはTannenbaumからです):

[...] PおよびV操作でのSの変更は、個別に実行されます。つまり、1つのプロセスがセマフォ値を変更すると、他のプロセスが同じセマフォ値を同時に変更することはできません。[...]

他の引用符は非常に似ているので、コピー&ペーストすると思われます:-)

重要なのは、テキストが同じように読めば、段落の意図を誤解したことです。これは「所有権」ではなく、同時アクセスについての「唯一の」ものです。複数のスレッドがまったく同時に1つのセマフォにアクセスしようとする場合、スレッドをシリアル化し、値の変更(すべてのリソースのセマフォ内に1つの値しかないことを忘れないでください)をアトミックにする必要があります。

于 2013-02-10T11:38:02.313 に答える