マルチスレッドアプリケーションをデバッグしていて、の内部構造を見つけましたCRITICAL_SECTION
。CRITICAL_SECTIONのデータメンバーLockSemaphore
が面白いと思いました。
LockSemaphore
自動リセットイベント(名前が示すようにセマフォではない)のように見え、オペレーティングシステムはCritcal Section
、他のスレッドによってロックされているスレッドが最初に待機するときに、このイベントをサイレントに作成します。
さて、クリティカルセクションは常に速いのだろうか?イベントはカーネルオブジェクトであり、各クリティカルセクションオブジェクトはイベントオブジェクトに関連付けられていますCritical Section
。Mutexなどの他のカーネルオブジェクトと比較して、どのように高速化できますか?また、内部イベントオブジェクトは実際にクリティカルセクションのパフォーマンスにどのように影響しますか?
:の構造は次のCRITICAL_SECTION
とおりです。
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};