2009-07-31 31 views

答えて

21

イベントオブジェクトはカーネルレベルのオブジェクトです。それらはプロセスの境界を越えて共有することができ、すべてのWindows OSバージョンでサポートされています。必要に応じて、それらを共有リソースへの独自のスタンドアロンロックとして使用できます。それらはカーネルオブジェクトであるため、一度に割り当てることができる利用可能なイベントの数に制限があります。

条件変数はユーザーレベルのオブジェクトです。プロセスの境界を越えて共有することはできず、Vista/2008以降でのみサポートされています。彼らは独自のロックとしては機能しませんが、クリティカルセクションのような別のロックを関連付ける必要があります。それらはユーザオブジェクトであるため、利用可能な変数の数は利用可能なメモリによって制限されます。条件変数をスリープ状態にすると、指定されたロックオブジェクトが自動的に解放され、別のスレッドがそれを取得できるようになります。条件変数が起動すると、指定されたロックオブジェクトが自動的に再取得されます。

機能の面では、条件変数は、一緒に働く2つのオブジェクト、つまりkeyed eventとロックオブジェクトの論理的な組み合わせとして考えることができます。条件変数がスリープ状態になると、イベント変数がリセットされ、ロックが解除され、イベントが通知されるのを待ってから、ロックが再度取得されます。たとえば、クリティカルセクションをロックオブジェクトとして使用する場合、SleepConditionalVariableCS()は、ResetEvent(),LeaveCriticalSection()WaitForSingleObject()、およびEnterCriticalSection()の一連の呼び出しに似ています。ロックとしてSRWLを使用する場合、SleepConditionVariableSRW()は、ResetEvent(),ReleaseSRWLock...(),WaitForSingleObject()、およびAcquireSRWLock...()の一連の呼び出しに似ています。

+0

CSにイベントが含まれている場合は、取得できませんシステムで使用可能なイベントの数ではなく、 – Mehrdad

+0

CSに* ACTUAL *イベントオブジェクトが含まれているとは言わず、「技術的には条件変数が実際に内部で行うことではありません」と言いましたが、イベントを使用するACTSと同じですが、 。 CSがどのように待っているかの詳細は、OSの実装に限定されています。例えば、 'SleepConditionVariableCS()'の場合、代わりに 'SleepEx()'を使う可能性が高く、 'WakeConditionVariable()'からのタイムアウトやAPCで目覚めてしまいます。それを反映するために私は答えによって更新しました。 –

+0

walkbearの回答を読み終えたら、実装は[キーイベント]を使用している可能性があります(http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features /)を待機可能オブジェクトとして使用します。このように、複数のCSは、常に利用可能で単一のカーネルイベントオブジェクトを共有することを使用しており、別々のスレッドによって個別に待機することができます。 –

2

これらは非常によく似ていますが、イベントオブジェクトはプロセス境界を越えて動作しますが、条件変数は動作しません。 MSDN documentation on condition variablesから:

条件変数は プロセス間で共有することができないユーザーモード オブジェクトです。

MSDN documentation on event objectsから:他のプロセスで

スレッドは OpenEvent関数の呼び出しでその名前を指定する することにより、既存のイベントオブジェクトに ハンドルを開くことができます。

+6

いいえ、レミー・ルボーは真実に近いです。条件変数は、最近UnixからWindowsにインポートされたものです。イベントオブジェクトは、条件の薄い模造です。事実、イベントオブジェクトとミューテックスのみが与えられた状態変数を実装することは自明ではありません。 http://www.cse.wustl.edu/~schmidt/win32-cv-1.htmlを参照してください。 – Arkadiy

1

最も大きな違いは、イベントオブジェクトがカーネルオブジェクトであり、プロセス/スレッドが取得しようとしている間はプロセス全体で共有できるということです。条件変数はユーザーモードオブジェクトです。ライト(ポインタと同じサイズで、使用後には何もリリースされません)より優れたパフォーマンスを備えています。

通常、データを適切に同期させる必要があるため、条件変数はロックとともに使用されることがよくあります。 Condition Variableを考慮すると、Vistaから改善されたキーイベントのように扱われます。

ジョーダフィーには、より詳細な情報を説明したブログ記事http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/があります。