イベントオブジェクトと条件変数の違いは何ですか? 私はWIN32 APIのコンテキストで尋ねています。イベントオブジェクトと条件変数の違い
答えて
イベントオブジェクトはカーネルレベルのオブジェクトです。それらはプロセスの境界を越えて共有することができ、すべてのWindows OSバージョンでサポートされています。必要に応じて、それらを共有リソースへの独自のスタンドアロンロックとして使用できます。それらはカーネルオブジェクトであるため、一度に割り当てることができる利用可能なイベントの数に制限があります。
条件変数はユーザーレベルのオブジェクトです。プロセスの境界を越えて共有することはできず、Vista/2008以降でのみサポートされています。彼らは独自のロックとしては機能しませんが、クリティカルセクションのような別のロックを関連付ける必要があります。それらはユーザオブジェクトであるため、利用可能な変数の数は利用可能なメモリによって制限されます。条件変数をスリープ状態にすると、指定されたロックオブジェクトが自動的に解放され、別のスレッドがそれを取得できるようになります。条件変数が起動すると、指定されたロックオブジェクトが自動的に再取得されます。
機能の面では、条件変数は、一緒に働く2つのオブジェクト、つまりkeyed eventとロックオブジェクトの論理的な組み合わせとして考えることができます。条件変数がスリープ状態になると、イベント変数がリセットされ、ロックが解除され、イベントが通知されるのを待ってから、ロックが再度取得されます。たとえば、クリティカルセクションをロックオブジェクトとして使用する場合、SleepConditionalVariableCS()
は、ResetEvent()
,LeaveCriticalSection()
、WaitForSingleObject()
、およびEnterCriticalSection()
の一連の呼び出しに似ています。ロックとしてSRWLを使用する場合、SleepConditionVariableSRW()
は、ResetEvent()
,ReleaseSRWLock...()
,WaitForSingleObject()
、およびAcquireSRWLock...()
の一連の呼び出しに似ています。
これらは非常によく似ていますが、イベントオブジェクトはプロセス境界を越えて動作しますが、条件変数は動作しません。 MSDN documentation on condition variablesから:
条件変数は プロセス間で共有することができないユーザーモード オブジェクトです。
MSDN documentation on event objectsから:他のプロセスで
スレッドは OpenEvent関数の呼び出しでその名前を指定する することにより、既存のイベントオブジェクトに ハンドルを開くことができます。
いいえ、レミー・ルボーは真実に近いです。条件変数は、最近UnixからWindowsにインポートされたものです。イベントオブジェクトは、条件の薄い模造です。事実、イベントオブジェクトとミューテックスのみが与えられた状態変数を実装することは自明ではありません。 http://www.cse.wustl.edu/~schmidt/win32-cv-1.htmlを参照してください。 – Arkadiy
最も大きな違いは、イベントオブジェクトがカーネルオブジェクトであり、プロセス/スレッドが取得しようとしている間はプロセス全体で共有できるということです。条件変数はユーザーモードオブジェクトです。ライト(ポインタと同じサイズで、使用後には何もリリースされません)より優れたパフォーマンスを備えています。
通常、データを適切に同期させる必要があるため、条件変数はロックとともに使用されることがよくあります。 Condition Variableを考慮すると、Vistaから改善されたキーイベントのように扱われます。
ジョーダフィーには、より詳細な情報を説明したブログ記事http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/があります。
- 1. 参加者の条件と条件の違い
- 2. 条件変数
- 3. 条件変数
- 4. 条件変数デッドロック
- 5. MySQLiの複数の条件、間違っ
- 6. pthread条件変数とのスレッド同期
- 7. PowerShellの条件付きタグと変数
- 8. 条件変数と#pragmaパックのバグ
- 9. TFS 2015変数の条件
- 10. Qtネットワークリクエストの条件変数
- 11. NLog条件変数の値
- 12. C - のpthread条件変数
- 13. 条件変数の実装
- 14. 条件変数ファーミング変数の合計。
- 15. 条件変数と共有ミューテックス
- 16. 変数セットと取得、競合条件
- 17. Pthread条件変数とデッドロックなし
- 18. 条件変数を含むPHP変数
- 19. 条件との結合とサブクエリ(フィルタ)との結合の違い
- 20. 条件付きスタック変数
- 21. Python条件変数設定
- 22. テラフォーム条件変数は
- 23. C++ multithreading:条件変数
- 24. チェック変数は、条件
- 25. 条件に基づいた変数debounceTime
- 26. OracleとMS SQL ServerのNOT条件とNOT()の違い
- 27. 複数条件whileループ(同じ変数内の複数条件付き)
- 28. 複数のサブクエリと条件
- 29. ハスケルと複数の条件
- 30. Windowsのカーネルオブジェクトとイベントオブジェクトの違いは何ですか?
CSにイベントが含まれている場合は、取得できませんシステムで使用可能なイベントの数ではなく、 – Mehrdad
CSに* ACTUAL *イベントオブジェクトが含まれているとは言わず、「技術的には条件変数が実際に内部で行うことではありません」と言いましたが、イベントを使用するACTSと同じですが、 。 CSがどのように待っているかの詳細は、OSの実装に限定されています。例えば、 'SleepConditionVariableCS()'の場合、代わりに 'SleepEx()'を使う可能性が高く、 'WakeConditionVariable()'からのタイムアウトやAPCで目覚めてしまいます。それを反映するために私は答えによって更新しました。 –
walkbearの回答を読み終えたら、実装は[キーイベント]を使用している可能性があります(http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features /)を待機可能オブジェクトとして使用します。このように、複数のCSは、常に利用可能で単一のカーネルイベントオブジェクトを共有することを使用しており、別々のスレッドによって個別に待機することができます。 –