2010-07-16 19 views
7

पारस्परिक बहिष्करण प्राप्त करने के लिए कोई CRITICAL_SECTION चर का उपयोग कर सकता है।एक CRITICAL_SECTION की प्रतिलिपि बनाने के लिए ठीक है?

मेरा प्रश्न है: CRITICAL_SECTION समर्थन प्रतिलिपि बनाता है? यदि मैं मूल्य के आधार पर किसी अन्य धागे को पास करता हूं, तो क्या मैं यह सुनिश्चित कर सकता हूं कि पारस्परिक बहिष्कार काम करेगा?

मुझे आश्चर्य नहीं होगा अगर जवाब "आप ऐसा नहीं कर सकते", लेकिन यह कुछ प्रकार की आधिकारिक पुष्टि होना अच्छा लगेगा। मैं प्रलेखन में किसी भी तरह का बयान नहीं ढूंढ पाया।

उत्तर

11

सं। CRITICAL_SECTION कॉपी नहीं किया जा सकता है। MSDN states this explicitly:

एक महत्वपूर्ण अनुभाग वस्तु को स्थानांतरित या कॉपी नहीं किया जा सकता है।

1

एक त्वरित खोज हेडर के माध्यम से पता चलता है कि संरचना winnt.h में परिभाषित किया गया है, और इस परिभाषा स्पष्ट रूप से संकेत मिलता है कि संरचना को कॉपी कार्य नहीं करेगा लगता है।

typedef struct _RTL_CRITICAL_SECTION { 
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo; 

    // 
    // The following three fields control entering and exiting the critical 
    // section for the resource 
    // 

    LONG LockCount; 
    LONG RecursionCount; 
    HANDLE OwningThread;  // from the thread's ClientId->UniqueThread 
    HANDLE LockSemaphore; 
    ULONG_PTR SpinCount;  // force size on 64-bit systems when packed 
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; 

यही कहा, मैं क्यों इन आंतरिक काउंटर एक उपयोगकर्ता के अंतरिक्ष संरचना में जमा हो जाती है पता नहीं, क्या होगा अर्थात एक कार्यक्रम इन संशोधित करता है, तो है?

+1

दस्तावेज़ीकरण स्पष्ट रूप से बताता है कि आप 'CRITICAL_SECTION' की सामग्री को संशोधित नहीं कर सकते:" प्रक्रिया को ऑब्जेक्ट को भी संशोधित नहीं करना चाहिए, लेकिन इसे तर्कसंगत अपारदर्शी के रूप में देखना चाहिए। " –

+0

यही कारण है कि मैंने इस सवाल को उठाया। "मतलब नहीं" क्या मतलब है? उपयोगकर्ता कार्यक्रमों द्वारा एक हैंडल से छेड़छाड़ करने के लिए कुछ भी असामान्य नहीं है। – casablanca

+0

यदि कोई एपीआई कहता है कि एपीआई _must_ का उपभोक्ता कुछ नहीं करता है, तो इसका मतलब है "यदि आप ऐसा करते हैं, तो सभी दांव बंद हो जाते हैं।" –

संबंधित मुद्दे