13

これはすべての人にとってプログラミング以外の質問である可能性があります。イベントなどのスレッド同期オブジェクトと、それがシグナル状態または非シグナル状態として設定される方法について読みました。しかし、私はこれらの用語を理解することができませんでし .それぞれが異なる方法で表現されており、私は少し混乱しています.

  1. このリンクは次のように述べています

    シグナル状態は、プロセスまたはスレッドがリソースを使用できることを示します。非シグナル状態は、リソースが使用中であることを示します。

  2. 大学のサイトからパワーポイントのプレゼンテーションを受け取りました。

    シグナル状態のオブジェクトは、そのオブジェクトを待機しているスレッドをブロックすることはなく、シグナル状態ではないオブジェクトは、オブジェクトが再びシグナル状態になるまで、そのオブジェクトを待機しているスレッドをブロックさせます。

  3. この3番目のリンクはこれを述べています

    イベントがシグナル状態にあるということは、このイベントがシグナルされるのを待っているスレッドを解放する能力があることを意味します。イベントが非シグナル状態にあるということは、この特定のイベントを待っているスレッドを解放しないことを意味します。

例を使用したこの概念の簡単な説明は、非常に役立ちます。

4

4 に答える 4

24

わかりました、あなたの 3 つの引用符は互換性がありません。しかし、実装に少し踏み込みましょう。

すべての待機可能なオブジェクトには、そのオブジェクトを待機するために使用されるシグナル状態と呼ばれるブール値が関連付けられています。オブジェクトがシグナル状態の場合、待機関数はそれを待機しません。オブジェクトが非シグナル状態の場合、待機関数それを待ちます。

では、これは特定のタイプのオブジェクトにどのように適用されるのでしょうか? それはオブジェクトの性質、特にそれを待つことに関連するセマンティクスに依存します。実際には、シグナル状態は待機条件によって定義されます。例(詳細についてはドキュメントを参照):

  • ミューテックスは、所有されていないときに通知されます。
  • プロセス/スレッドは、終了時に通知されます。
  • セマフォは、そのカウントが 0 より大きい場合に通知されます。
  • 待機可能なタイマーは、期限切れになると通知されます。

所有されているときにミューテックスが通知された方がいいかもしれませんが、実際には所有されていないときに通知されます。これは、待機関数が正しいことを行うために必要です。

そして、イベントはどうですか?まあ、それらはいくぶん単純なオブジェクトであり、自由にシグナルを送信したり、シグナルを解除したりできるため、シグナル状態には追加の意味はありません。

  • signalled: スレッドはそれを待ちません。
  • non-signalled: スレッドはそれを待ちます。

イベントにもこれSignalPulseAutoReset少し独特なものがあります(そしてIMEを正しく使用することは事実上不可能です)。

それでは、あなたの引用を見てみましょう:

シグナル状態は、プロセスまたはスレッドがリソースを使用できることを示します。非シグナル状態は、リソースが使用中であることを示します。

実際、それは解釈です。通常、調停しようとしているリソースがあり、通常、そのリソースが使用されている場合にのみ待機するため、使用中のリソースとリソースの待機が同等になります。しかし、それは技術的な要件ではなく、通常のユース ケースです。

シグナル状態にあるオブジェクトは、そのオブジェクトを待機しているスレッドをブロックすることはなく、シグナル状態にないオブジェクトは、オブジェクトが再びシグナル状態になるまで、そのオブジェクトを待機しているスレッドをブロックさせます。

正しくて要点!

イベントがシグナル状態にあるということは、このイベントがシグナルされるのを待っているスレッドを解放する能力があることを意味します。イベントが非シグナル状態にあるということは、この特定のイベントを待っているスレッドを解放しないことを意味します。

この言い回しは少しややこしいと思います...しかし、前のものに何も追加しません。

于 2013-07-12T11:19:25.587 に答える
0

私は他の答えに本当に同意しません。彼らはポイントを逃しています:

  • signaled プロパティがtrue の場合 => イベントは今より前に発生しました。

  • signaled プロパティがfalseの場合 => イベントは今まで発生していません

ここで、「シグナル プロパティがfalseである」は、「非シグナル プロパティがtrueである」と同じです。

また、3 つの定義はすべてスレッドを参照していますが、シグナルの定義はマルチスレッドではなく低レベルのプログラミングに由来するため、明確ではありません。

信号は割り込みから発生します。
その信号が高くなった場合(=割り込み)、実行ポインタをこの関数に移動します」。
これがシグナルの意味であり、スレッド化によるものではなく、割り込みによるものです。で、無信号ということは今まで信号がハイにならなかったということです。

スレッド化では、これは次のようになります。「スレッドは、イベントが継続するために発生する必要があります。それが今より前に発生した場合は、続行できます。そうでない場合は、それ自体をブロックして待機します。

于 2019-04-19T10:12:13.400 に答える