ताला (नई वस्तु ()) - कार्गो पंथ या कुछ पागल "भाषा विशेष मामला"?


87

मैं एक सलाहकार द्वारा लिखे गए कुछ कोड की समीक्षा कर रहा हूं, और जब दर्जनों लाल झंडे पहले से ही पॉप अप कर चुके हैं, तो मैं निम्नलिखित स्निपेट के आसपास अपना सिर नहीं लपेट सकता:

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}

ताला (नई वस्तु ()) यहाँ क्या कर रहा है? किसी भी तरह का कोई प्रभाव नहीं होना चाहिए क्योंकि यह हमेशा किसी अन्य ऑब्जेक्ट पर लॉक होता है, लेकिन इस तरह की लॉकिंग पूरे कोड में लगातार होती है, यहां तक ​​कि गैर-कॉपी-और-पेस्ट किए गए हिस्सों में भी। क्या यह सी # भाषा में कुछ विशेष मामला है जो किसी ऐसी चीज के लिए संकलित है जिसके बारे में मुझे नहीं पता है, या प्रोग्रामर ने कुछ कार्गो पंथ को अपनाया है जो कुछ समय पहले काम करने के लिए हुआ था?


19
मुझे लगता है कि वे बहुत भ्रमित हैं। उन्होंने शायद यह देखा कि new object()एक क्षेत्र में कहां संग्रहीत किया गया था, और उस क्षेत्र को lock()बयानों में उपयोग किया गया था , और वे इसे इनलाइन नहीं करना बेहतर जानते थे।
डेमियन___बेलिवर्स

21
यही कारण है कि "सलाहकार" है कुछ करने के लिए समझा ... आप गलत नहीं हैं: कि lockकोड पूरी तरह से बेकार है
मार्क Gravell

12
@ बाबून: केवल अगर आप एक ऐसा व्यक्ति नहीं हैं जिसे रिफैक्टरिंग करना है ...

2
इसके अलावा, अगर यह WinForms है, तो मैं यह नहीं देख सकता कि वहां पर ताला क्यों होना चाहिए।
ड्रू नोक

7
इसे निकालें, फिर अपना 100% कोड-कवरेज परीक्षण सूट फिर से चलाएं। वह क्या है? पिछले सलाहकार एक नहीं बना?
स्पेसमैन

जवाबों:


82

अगर यह किसी ने देखा तो मुझे आश्चर्य नहीं होगा:

private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}

और सोचा कि वह लाइनों की संख्या में कटौती कर सकता है।

मैं बहुत चिंतित हूँ अगर यह मामला था ...


4
उन्होंने "newObject ()" नामक एक विधि देखी और इस पद्धति ने एक एकल उदाहरण दिया, लेकिन उन्होंने कहा "अरे, क्या उस के लिए # कीवर्ड नहीं हैं"?
अमीरराम कोरच

9
यह वास्तव में प्रभावी रूप से समझने के बिना एक refactoring नौकरी की तरह लगता है कि क्या चल रहा था।
Aphelion

1
@ ऑरेंजडॉग: अफसोस की बात है, यह असंभव है, क्योंकि कंपनी में शामिल होने से पहले संबंधित कोड लिखा गया था। अब जबकि बदलाव करने हैं, हो सकता है कि मैं कोड को ठीक करने के लिए प्रबंधन को मना सकूं। अन्यथा मैं किसी भी अस्थिरता के लिए ज़िम्मेदारी नहीं लूंगा (किसी भी चीज़ को छूने के लिए अंतिम एक दोष है) ...

2
@ आईब्रडर उच्च प्राथमिकता प्रबंधन को यह समझाने के लिए होगी कि उन्हें संस्करण नियंत्रण, स्वचालित परीक्षण और समीक्षा प्रणालियों की आवश्यकता है। यदि किसी को छूने के लिए अंतिम दोष है, तो यह एक बहुत अच्छी कंपनी की तरह काम करने के लिए नहीं है।
ऑरेंजडॉग

1
मैं स्पष्ट रूप से टूटी हुई लॉकिंग के बारे में अधिक परवाह नहीं करता - बाकी सभी ने पहले ही इसे इंगित किया है, लेकिन सिर्फ 'के लिए' या iOS 4/5 'पर कार्यक्रमों <<>
मार्टिन जेम्स

15

यहाँ समान प्रश्न है, और उत्तर:

ताले आपसी बहिष्कार को सुनिश्चित करते हैं - एक ही समय में एक से अधिक धागे लॉक को पकड़ नहीं सकते हैं। लॉक को एक विशिष्ट ऑब्जेक्ट उदाहरण से पहचाना जाता है। आप हर बार लॉक करने के लिए एक नई ऑब्जेक्ट बना रहे हैं और आपके पास उस सटीक ऑब्जेक्ट उदाहरण पर लॉक करने के लिए किसी अन्य थ्रेड को सूचित करने का कोई तरीका नहीं है। इसलिए, आपका ताला बेकार है।


2

यह शायद बेकार है। लेकिन वहाँ एक बंद मौका यह एक स्मृति बाधा बनाने के लिए है। यह सुनिश्चित नहीं है कि अगर c # लॉक एलीशन करता है या यदि यह करता है कि क्या यह लॉक के ऑर्डर सिमेंटिक्स को सुरक्षित रखता है।


यह कुछ साल पहले था लेकिन आदमी, आप इस स्पष्ट तथ्य को बताने के लिए पूरी तरह से योग्य हैं कि कुछ लोगों ने पूरी तरह से अनदेखा कर दिया। उदाहरण के लिए, यूनिवर्सल विंडोज प्लेटफ़ॉर्म पर इंटरलाकेड के साथ कोई मेमोरीबेरियर () विधि और जादू नहीं है। कुछ समस्याओं से निपटने के लिए ताला (नया ऑब्जेक्ट) ही लॉक (नया ऑब्जेक्ट) है।
सेर्गेई.विक्सियोटिकैक्सिस। इवानोव

मुझे यह भी नहीं पता था कि C # ने इसकी अनुमति दी है। आप में से सभी इसे इंगित करते हैं।
सभी को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.