2010-01-22 19 views
50

कृपया बताएं कि मुख्य अंतर क्या हैं और मुझे इसका उपयोग कब करना चाहिए।
वेब बहु थ्रेडेड अनुप्रयोगों पर ध्यान केंद्रित करें।रीडरवाइटर लॉक बनाम लॉक {}

उत्तर

46

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

+1

तो आप जो कह रहे हैं वह यह है कि यदि पहला धागा एक मान को ताला लगा देता है {} कोई अन्य धागा इसे एक ही समय में पढ़ सकता है? – kenny

+0

बिल्कुल, 'लॉक' लॉक स्टेटमेंट के शरीर को निष्पादित करने के लिए एक और केवल एक थ्रेड की अनुमति देगा। –

+3

"तो यह अधिक कुशल हो सकता है": लेकिन शायद नहीं होगा और आपका कोड अधिक जटिल होगा। यह विशिष्ट मामलों के लिए आरक्षित होना चाहिए। – Richard

15

ReaderWriterLock का उपयोग कर यदि आप धागे कि केवल डेटा और इन धागे अवरुद्ध हो रहे ताला और के लिए इंतज़ार कर पढ़ने की जरूरत है की बहुत सारे है और आप अक्सर डेटा को बदलने की जरूरत नहीं है पर विचार करें।

हालांकि ReaderWriterLock एक थ्रेड को अवरुद्ध कर सकता है जो लंबे समय तक लिखने की प्रतीक्षा कर रहा है।

इसलिए केवल ReaderWriterLock उपयोग करने के बाद आप पुष्टि की आप "वास्तविक जीवन" में ताला के लिए उच्च विवाद मिलता है और आप की पुष्टि की है आप करने के लिए अपने ताला डिजाइन नया स्वरूप नहीं कर सकता को कम कब तक ताला है के लिए आयोजित किया गया।

यह भी विचार करें कि क्या आप डेटाबेस में साझा डेटा को स्टोर नहीं कर सकते हैं और इसे सभी लॉकिंग का ख्याल रखने की अनुमति देते हैं, क्योंकि यह आपको बग्स को ट्रैक करने में कठिन समय देने की संभावना कम है, अगर डेटाबेस डेटाबेस है आपके आवेदन के लिए पर्याप्त तेज़।

में कुछ मामलों आप साझा डेटा को संभालने के लिए Aps.net कैश का उपयोग करने में भी सक्षम हो सकते हैं, और जब डेटा बदलता है तो आइटम को कैश से हटा दें। अगला पठन कैश में एक ताजा प्रति डाल सकता है।

"लॉकिंग का सबसे अच्छा प्रकार है ताला लगा आप की जरूरत नहीं है (अर्थात धागे के बीच नहीं शेयर डेटा करते हैं)।" याद रखें

8

मॉनिटर और अंतर्निहित "syncblock" है कि किसी भी संदर्भ वस्तु — सी # के lock — समर्थन अनन्य निष्पादन के तहत अंतर्निहित तंत्र के साथ जुड़ा हो सकता है। केवल एक धागा में ताला हो सकता है। यह सरल और कुशल है।

ReaderWriterLock (या, V3.5 में, बेहतर ReaderWriterLockSlim) एक और जटिल मॉडल प्रदान करते हैं। तब तक बचें जब तक कि आप नहीं जानते हैं, यह अधिक कुशल होगा (यानी आपके समर्थन के लिए प्रदर्शन माप हैं)।

लॉकिंग का सबसे अच्छा प्रकार लॉकिंग है जिसकी आपको आवश्यकता नहीं है (यानी धागे के बीच डेटा साझा न करें)।

+4

+1 "सबसे अच्छा लॉकिंग लॉकिंग है जिसकी आपको आवश्यकता नहीं है (यानी धागे के बीच डेटा साझा न करें)।" –

4

रीडरवाइटर लॉक आपको एक ही समय में रीडलॉक को एकाधिक थ्रेड रखने की अनुमति देता है ...ताकि आपके साझा डेटा को कई धागे द्वारा एक बार में खपत किया जा सके। जैसे ही एक लिखित लॉक का अनुरोध किया जाता है, कोई और रीडलॉक्स नहीं दिया जाता है और लिडलॉक के लिए प्रतीक्षा कोड तब तक अवरुद्ध हो जाता है जब तक रीडलॉक्स के सभी थ्रेड उन्हें जारी नहीं करते हैं।

लिखित लॉक केवल एक थ्रेड द्वारा आयोजित किया जा सकता है, अपने कोड के उपभोग करने वाले हिस्सों के दृष्टिकोण से आपके 'डेटा अपडेट' परमाणु दिखाई दे सकता है।

दूसरी तरफ लॉक केवल एक थ्रेड को एक समय में प्रवेश करने की अनुमति देता है, जिसमें थ्रेड के लिए कोई भत्ता नहीं है जो साझा डेटा का उपभोग करने की कोशिश कर रहा है।

रीडरवाइटर लॉकस्लिम रीडरविटर लॉक का एक नया और अधिक प्रदर्शन संस्करण है जो रिकर्सन के लिए बेहतर समर्थन और लॉक से धागा को स्थानांतरित करने की क्षमता है जो अनिवार्य रूप से लिडलॉक को रीडलॉक (अपग्रेड करने योग्य रीडलॉक) में रीडलॉक है।

1

मैं http://www.albahari.com/threading/ देखकर सुझाव दूंगा - रीडरवाइटर लॉकस्लिम (जिसे आप रीडरवाइटर लॉक के बजाय उपयोग करना चाहते हैं) के बारे में तीन वार्ताएं।

6

रीडरवाइटर लॉक/स्लिम विशेष रूप से एक उपभोक्ता/एकल निर्माता परिदृश्य में कुशलतापूर्वक लॉक करने में आपकी सहायता के लिए डिज़ाइन किया गया है। लॉक स्टेटमेंट के साथ ऐसा करना संभव है, लेकिन कुशल नहीं है। लॉक प्राप्त करने के लिए आक्रामक रूप से स्पिनलॉक करने में सक्षम होने के कारण आरडब्लूएल/एस ऊपरी हाथ प्राप्त करता है। इससे आपको लॉक कफॉय से बचने में मदद मिलती है, लॉक कथन के साथ एक समस्या जहां थ्रेड लॉक प्राप्त नहीं कर सकता है, जब यह ताला हासिल नहीं कर सकता है, क्योंकि यह थोड़ी देर के लिए पुन: निर्धारित नहीं किया जाएगा।

2

यह सच है कि रीडरवाइटर लॉकस्लिम रीडरवाइटर लॉक से तेज़ है। लेकिन रीडरवाइटर लॉकस्लिम द्वारा स्मृति खपत पूरी तरह से अपमानजनक है। एक मेमोरी प्रोफाइलर संलग्न करने का प्रयास करें और खुद के लिए देखें। मैं ReaderWriterLockSlim पर किसी भी दिन ReaderWriterLock चुनूँगा।

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