0

と を使用Waitして、次のようPulseに a をシミュレートできます。ManualResetEvent

コード#1

readonly object _locker = new object();
bool _signal;
void WaitOne()
{
  lock (_locker)
   {
     while (!_signal) Monitor.Wait (_locker);
   }
}

void Set()
{ 
   lock (_locker) 
      { _signal = true; 
        Monitor.PulseAll (_locker); 
      }
}

void Reset() 
   {
    lock (_locker) _signal = false; 
   }

大丈夫

次に、それを次のように強化することについて話しましょうAutoREsetEvent

AutoResetEventコードを次のように置き換えるだけですWaitOne

コード#2

lock (_locker)
{
    while (!_signal) Monitor.Wait (_locker);
    _signal = false;//<---------------
}

メソッド内で次のPulseAllように置き換えます。PulseSet

コード#3

lock (_locker) 
   { _signal = true; 
     Monitor.Pulse (_locker); 
   }

ここで質問です。コード #2 の行_signal = false;

なぜ必要なのですか?1 つの待機ハンドルPulseにのみ到達し、ブロックされたアイテムを 1 つだけ通過させ、ゲートを自動的に閉じることを知っています。AutoREsetEvent

では、なぜ書く_signal = false必要があるのですか?.

4

1 に答える 1

3

_signal変数が のままである場合、呼び出しのtrue別のスレッドが呼び出しても、待機しません。既存の待機中のスレッドがどのように処理されるかを考慮するだけでなく、オブジェクトの全体的な状態を考慮する必要があります。WaitOne Set

于 2012-07-06T11:59:49.713 に答える