3
Wait(semaphore sem) {                           
  DISABLE_INTS
    sem.val--
    if (sem.val < 0){
      add thread to sem.L
      block(thread)
    }
  ENABLE_INTS

Signal(semaphore sem){
  DISABLE_INTS
    sem.val++
    if (sem.val <= 0) {
      th = remove next
         thread from sem.L
      wakeup(th)
    }
  ENABLE_INTS

block(thread)a の実行を停止した場合thread、どのように、どこで、いつ戻るのでしょうか?

次の割り込みを有効にするスレッドはどれWait()ですか? thread呼び出された は、block()別のスレッドが呼び出されるまで返されるべきではありませんwakeup(thread)!

  • しかし、その他のスレッドはどのように実行されるのでしょうか?
  • スレッドの切り替えは正確にどこで行われますか?
4

2 に答える 2

1

block(thread)そのように動作します:

  1. 割り込みを有効にします
  2. ある種の待機メカニズム (オペレーティング システムによって提供されるか、最も単純なケースではビジー待機によって提供される) を使用してwakeup(thread)、このスレッドの が呼び出されるまで待機します。これは、この時点threadでスケジューラに時間を譲ることを意味します。
  3. 割り込みを禁止して復帰します。
于 2012-03-16T21:03:32.363 に答える
0

はい、UPDOWNは異なるスレッドから呼び出された場合に最も役立ちますが、1 つのスレッドでこれらを呼び出すことは不可能ではありません。値 > 0 でセマフォを開始すると、同じスレッドがクリティカル セクションに入り、両方の DOWN を実行できます。 (前) と UP (後)。セマフォを初期化する値は、一度にクリティカル セクションに入ることができるスレッドの数を示します。これは 1 (ミューテックス) またはその他の正の数です。

スレッドはどのように作成されますか? これは、疑似コードを使用してセマフォがどのように機能するかの原則にすぎないため、講義スライドには示されていません。しかし、アプリケーションでこれらのセマフォをどのように使用するかは、まったく別の話です。

于 2014-06-24T13:40:26.763 に答える