2011-12-27 23 views
5

क्या है बेहतर:

या
बड़े क्षेत्र में छोटे ताले के लिए ताला बयान में बड़ी कोड क्षेत्र के लिए .. इस नमूने में
एक्सचेंजों अस्थिर नहीं कर रहे हैं? ।कोड क्षेत्रों लॉक करने के लिए उचित तरीका क्या है

lock (padLock) 
{ 
    foreach (string ex in exchanges) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
......... 
} 

या

foreach (string ex in exchanges) 
{ 
    lock (padLock) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
    } 
..... 
+2

यह पूरी तरह से निर्भर करता है कि आप किसके लिए लॉक कर रहे हैं। – SLaks

+0

@ एसएलएक्स, मुझे लगता है कि लॉकिंग का उपयोग करने के लिए मुझे पूरी तरह से समझ नहीं आता है .. :( – 0x49D1

+1

आपका उदाहरण पूरा नहीं हुआ है, इसलिए प्रश्न के दायरे में यह समझ में नहीं आता है क्योंकि लूप में न तो 'पूर्व' और न ही 'एक्सचेंज' का उपयोग नहीं किया जाता है, इसलिए आपको कुछ कंक्रीट – sll

उत्तर

1

व्यापक लॉक - जितना कम आप मल्टीथ्रेडिंग से प्राप्त करते हैं, और इसके विपरीत तो ताले का उपयोग पूरी तरह से तर्क पर निर्भर करता है। केवल बातें और स्थानों जो बदलते लॉक और आप संग्रह sub प्रयोग करने के लिए लॉक कर देते हैं एक समय

में एक धागा द्वारा केवल चलाने के लिए है - छोटे लॉक का उपयोग, लेकिन आप समानांतर

1

अच्छा अभ्यास ही नहीं क्षेत्र है जिसमें आप एक निश्चित समय

में केवल एक धागा द्वारा निष्पादित किया जा करना चाहते हैं लॉक करने के लिए उस क्षेत्र पूरी foreach पाश है तो हो सकता है पहला दृष्टिकोण ठीक है

लेकिन यदि वह क्षेत्र केवल एक पंक्ति है जैसा आपने दिखाया है तो दूसरा दृष्टिकोण है तो दूसरे दृष्टिकोण के लिए जाएं

1

में एकाधिक foreach छोरों में चलाते हैं यह विशेष मामला, सबसे अच्छा विकल्प पहला है, क्योंकि अन्यथा आप केवल समय लॉकिंग/अनलॉक कर रहे हैं क्योंकि आपको पूरे लूप को निष्पादित करना होगा। तो ऐसे लूप में समांतरता के लिए बहुत अधिक अवसर नहीं है जो वैसे भी व्यक्तिगत परमाणु संचालन निष्पादित करता है। http://software.intel.com/en-us/articles/managing-lock-contention-large-and-small-critical-sections/

0

आप को प्रभावी ढंग से न्याय नहीं कर सकते हैं जो "सही" दिया कोड के टुकड़े के साथ है:

महत्वपूर्ण अनुभाग आकार के बारे में अधिक सामान्य सलाह के लिए इस लेख की जाँच करें। पहला उदाहरण कहता है कि लोगों के लिए एक्सचेंजों से सामग्री के केवल एक हिस्से के साथ सब देखने के लिए ठीक नहीं है। दूसरा उदाहरण कहता है कि लोगों के लिए एक्सचेंजों से सामग्री के केवल एक हिस्से के साथ सब देखना ठीक है।

1

मुझे लगता है कि दो अलग-अलग प्रश्न हैं:
1. कौन सा सही होगा?
2. कौन सा बेहतर प्रदर्शन करेगा?

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

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

+0

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

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