मैं एक बहु थ्रेडेड अनुप्रयोग डीबग कर रहा था और CRITICAL_SECTION
की आंतरिक संरचना पाई। मुझे CRITICAL_SECTION के डेटा सदस्य LockSemaphore
को एक दिलचस्प व्यक्ति मिला।क्या गंभीर अनुभाग हमेशा तेज है?
ऐसा लगता है कि LockSemaphore
एक ऑटो-रीसेट ईवेंट है (नाम के रूप में एक सेमफोर नहीं है) और ऑपरेटिंग सिस्टम चुपचाप इस घटना को बनाता है जब पहली बार थ्रेड Critcal Section
पर प्रतीक्षा करता है जो किसी अन्य थ्रेड द्वारा लॉक किया जाता है।
अब, मुझे आश्चर्य है कि गंभीर अनुभाग हमेशा तेज है? इवेंट एक कर्नेल ऑब्जेक्ट है और प्रत्येक क्रिटिकल सेक्शन ऑब्जेक्ट इवेंट ऑब्जेक्ट से जुड़ा हुआ है, तो Critical Section
म्यूटेक्स जैसी अन्य कर्नेल ऑब्जेक्ट्स की तुलना में तेज़ी से कैसे हो सकता है? साथ ही, आंतरिक घटना वस्तु वास्तव में गंभीर खंड के प्रदर्शन को कैसे प्रभावित करती है?
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
यह भी याद रखें कि क्रिटिकलसेक्शन कार्यान्वयन विवरण ओएस के संस्करण से संस्करण में भिन्न हो सकते हैं। इन विवरणों को देखने के लिए निर्देशक हो सकते हैं, लेकिन उन पर भरोसा न करें, क्योंकि वे बदल सकते हैं। –
यह निश्चित रूप से NT5 – paulm