2

よく言われるセマフォ…ビジー状態で待機することはありますか? 私は用語と混同しています。私が導き出した結論のうち、どれが真実か教えてください。

a) スピンロックにはビジーな待機が含まれるため、それを避けるためにセマフォがあります。
b) セマフォは一種のスピンロックですが、忙しく待たずにセマフォを持つことができます
c) pthread_condition 変数はセマフォと同じことをしますか? もしそうなら、semaphore.h ライブラリのセマフォと同等ですか。両方が同じ機能を表している場合、私は混乱しています。

4

2 に答える 2

4

抽象的には、セマフォはそれに関連付けられたいくつかの許可を持つロックです。セマフォは次の2つの操作をサポートします。

  1. 許可の数を増やすUp、および
  2. ダウン。許可の数を減らそうとします。十分な許可が利用できない場合、この操作は十分な許可が利用可能になるまで待機します。

セマフォを実装する方法はたくさんあります。ただし、通常、セマフォはスピンロックとして実装されておらず、実際にはOSにスレッドをブロックさせ、要求された許可が利用可能になるまでスレッドをスリープ状態にします。とはいえ、セマフォを完全に合法的に実装すると、ビジーウェイトになる可能性があります。私はこれを行う実装を知らないだけです。

条件変数は異なる概念を表します。通常、セマフォは、非常に多くのコピーしか存在しないリソースを管理するように設計されています。リソースを必要とする各スレッドは、リソースへのアクセスを保護するセマフォが使用可能になるまで待機し、リソースを使用する各スレッドは1つの許可を所有します。条件変数は通常、スレッドが特定のイベントの発生を待機できるようにするために使用されます。彼らは通常、操作をサポートします

  1. 信号が送られるまでスレッドをブロックする待機
  2. 通知します。これは、条件変数を待機している1つのスレッドに、続行できることを通知します。
  3. Notify-allは、条件変数を待機しているすべてのスレッドに続行できることを通知します。

条件変数とセマフォは(通常)交換可能に使用でき、ロックの使用法の設計を適切に変更できます。ただし、セマフォの操作が簡単な場合もあれば、条件変数の操作が簡単な場合もあるため、両方のプリミティブを使用できます。通常、使用している特定のライブラリまたは言語のために、どちらか一方を使用することを選択します。たとえば、Javaオブジェクトにはモニター(ロックとペアになった条件変数)のサポートが組み込まれているため、Javaセマフォは存在しますが、Javaで条件変数を使用すると便利なことがよくあります。Windowsでプログラミングしている場合、条件変数は存在しますが、セマフォが同期の推奨される方法です。

お役に立てれば!

于 2012-02-06T03:46:38.853 に答える
0

スピンロックはビジーウェイトを使用するため、spinという名前が付けられています。スレッドスピンは何もしません。

ロックがクリティカルセクション(CS)で許可するまで、「入ることができますか?入ることができますか?入ることができます...など」とは何ですか。

セマフォ:通常、シグナル/通知とキューを使用して実装されるため、スレッドがセマフォを踏むと、クリティカルセクションに別のスレッドがある場合、スレッドはスリープ状態になり、キューに入ります。CSに他のスレッドがない場合、現在のスレッドがCSに入ります。別のスレッドがCSにある間にセマフォを踏む他のすべてのスレッドは、キューに入ります。最初のスレッドがCSを出ると、セマフォを再び踏みます。セマフォは、キュー内の最初のスレッドを取得して起動します。これにより、スレッドがCSに入ります。

シグナル/待機で実装されたセマフォを使用して、スレッドは私が入ることができると言いますか?いいえの場合は、できる限り起こしてくださいと表示されます。はいの場合、それは入ります。

編集:セマフォと条件

条件での待機および信号操作は、セマフォのカウントでのPおよびV操作と非常によく似ています。waitステートメントはスレッドの実行をブロックできますが、signalステートメントは別のスレッドの再開を引き起こす可能性があります。ただし、それらの間には違いがあります。セマフォカウンターはゼロより大きい可能性があるため、P操作は必ずしもスレッドをブロックするわけではありません。ただし、waitステートメントは常にスレッドをブロックします。シグナルステートメントは、V操作がセマフォでブロックされたスレッドを準備するのと同じように、条件でブロックされたスレッドを準備(ブロック解除)できます。違いは、V操作は常にセマフォカウンターをインクリメントすることです。これにより、後続のP操作に影響を与えます。空の状態のシグナルステートメントは、後続の待機ステートメントに影響を与えないため、失われます。もう1つの違いは、セマフォでブロックされた複数のスレッドは、十分なV操作が実行されれば、遅滞なく実行を再開できることです。ミューテックスタイプの場合、複数のシグナルステートメントは複数のスレッドのブロックを解除しますが、ミューテックスタイプの相互排除プロパティのため、これらのスレッドの1つだけが実行できます。

于 2012-02-06T03:47:33.293 に答える