मैं कुछ डिबग एक CRITICAL_SECTION अनलॉक करने का कोड की जाँच जोड़ने की कोशिश कर रहा हूँ, और मैं निम्नलिखित की कोशिश की: (वी.एस. 2005 के साथ, ज्यादातर है Windows XP पर) CRITICAL_SECTIONS डिबगिंग मैं "पता" सेCRITICAL_SECTION प्रकार के हैंडल का स्वामित्व थ्रेड सदस्य क्यों है, जब यह थ्रेड आईडी को इंगित कर रहा है?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
कि का मान OwningThread
(RTL_CRITICAL_SECTION
संरचना winnt.h
में परिभाषित संरचना का सदस्य) लॉक रखने वाले थ्रेड के आईडी का मान है।
हालांकि सूत्र आईडी (unsigned long
के लिए typedef) DWORD
का प्रतिनिधित्व कर रहे मूल्यों जबकि इस वैरिएबल प्रकार HANDLE
(void*
के लिए typedef) है ऊपर कोड काम करने के लिए
एक
के लिए reinterpret_cast
HandleToULong
basetsd.h
से मैक्रो के उपयोग की आवश्यकता होती है।
भी MSDN docs राज्य:
पहले धागा EnterCriticalSection दिनचर्या आवश्यकता होने पर, (...) OwningThread करने वाले का धागा आईडी हो जाता है।
तो पृथ्वी पर क्यों इसे HANDLE
के रूप में परिभाषित किया गया है?
संपादित करें नोट: मैं a statement पाया जहां एक पोस्टर पता चलता है कि हैंडल/DWORD-ईद बेमेल कुछ Windows internals के कुछ ज्ञात misfeature है। तो शायद इस मामले यहाँ भी है:
GetCurrentThreadId एक DWORD, जो मैं एक संदेश में गिरी अप करने के लिए भेज देता है। PsLookupThreadByThreadId, एक हैंडल में धागा आईडी लेता है ... ...
यह एक ज्ञात Windows API बग ("ज्ञात" है कि मैं इस बारे में प्रासंगिक फिल्टर प्रबंधक देव से बात की, के रूप में यह में दिखाई देता है में है फ़िल्टर करें प्रबंधक I/O प्रबंधक API समस्या के कारण भी।) जब तक आप में आधे बिलियन या उससे अधिक धागे और प्रक्रियाएं नहीं हैं (वे एक साझा साझा हैंडल तालिका का उपयोग करें) तो आप ठीक होंगे । शायद द्वारा यह एक वास्तविक मुद्दा है, हम कुछ अलग चलेंगे। [आरई: 64 बिट के लिए हैंडल के लिए ThreadId?, 08 अगस्त 08 14:21, टोनी मेसन]
किसी भी मामले में reinterpret_cast अधिक है। एक static_cast करेंगे। हैंडल और डीडब्ल्यूओआर दोनों अभिन्न प्रकार हैं। –
@ArmenTsirunyan - नहीं, वीएस2005 में आप एक हैंडल को एक डंडर में डालने के लिए static_cast का उपयोग नहीं कर सकते: 'त्रुटि C2440:' static_cast ':' हैंडल 'से' DWORD '' –
में परिवर्तित नहीं हो सकता है यह अजीब है। क्या आप कृपया मुझे बता सकते हैं कि वे किस प्रकार टाइप किए गए हैं? –