लॉक-फ्री मल्टी-थ्रेडिंग असली थ्रेडिंग विशेषज्ञों के लिए है


86

मैं एक जवाब के माध्यम से पढ़ रहा था जो जॉन स्कीट ने एक प्रश्न के लिए दिया था और इसमें उन्होंने इसका उल्लेख किया था:

जहां तक ​​मेरा सवाल है, लॉक-फ्री मल्टी-थ्रेडिंग असली थ्रेडिंग विशेषज्ञों के लिए है, जिनमें से मैं एक नहीं हूं।

यह पहली बार नहीं है कि मैंने यह सुना है, लेकिन मुझे बहुत कम लोग इस बारे में बात करते हुए मिलते हैं कि अगर आप लॉक-फ्री मल्टी-थ्रेडिंग कोड लिखना सीखना चाहते हैं तो आप वास्तव में इसे कैसे करते हैं।

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

चियर्स


मैं gcc, linux और X86 / X68 प्लेटफार्मों का उपयोग करता हूं। लॉक-फ्री लगभग उतना कठिन नहीं है जितना कि वे सभी इसे आवाज़ देते हैं! जीसीसी परमाणु बिल्डरों में इंटेल पर मेमोरी बाधाएं हैं, लेकिन यह वास्तविक जीवन में कोई फर्क नहीं पड़ता है। क्या मायने रखता है कि स्मृति को परमाणु रूप से संशोधित किया गया है। जब आप "लॉक फ्री" डेटा स्ट्रक्चर्स को डिज़ाइन करते हैं तो यह केवल तभी हिल जाता है, जब किसी अन्य थ्रेड में कोई परिवर्तन दिखाई देता है। सिंगल लिस्टेड लिस्ट्स, स्किप लिस्ट्स, हैश टेबल, फ्री लिस्ट, आदि सभी बहुत आसानी से लॉक फ्री हो जाते हैं। लॉक फ्री सब कुछ के लिए नहीं है। यह सिर्फ एक और उपकरण है जो कुछ स्थितियों के लिए सही है।
२१:०४ पर जॉन्नीक्रैश


संसाधन अनुशंसा के रूप में बंद करने, या जो आप पूछ रहे हैं, उसे स्पष्ट नहीं करना।
सिरो सेंटिल्ली 郝海东 i i i

जवाबों:


100

वर्तमान "लॉक-फ्री" कार्यान्वयन अधिकांश समय एक ही पैटर्न का पालन करते हैं:

  • * कुछ राज्य पढ़ें और इसकी एक प्रतिलिपि बनाएं **
  • * कॉपी संशोधित **
  • एक इंटरलाक्ड ऑपरेशन करें
  • विफल होने पर पुनः प्रयास करें

(* वैकल्पिक: डेटा संरचना / एल्गोरिथ्म पर निर्भर करता है)

अंतिम बिट एक स्पिनक के समान है। वास्तव में, यह एक बुनियादी स्पिनलॉक है । :)
मैं इस पर @nobugz से सहमत हूं: लॉक-फ्री मल्टी-थ्रेडिंग में उपयोग किए जाने वाले इंटरलॉक किए गए संचालन की लागत कैश और मेमोरी-कोहेरेंसी कार्यों पर हावी है जिसे इसे पूरा करना होगा

हालांकि आपको "लॉक-फ़्री" डेटा संरचना के साथ जो हासिल होता है वह यह है कि आपके "ताले" बहुत बारीक होते हैं । यह मौका घटाता है कि दो समवर्ती धागे एक ही "लॉक" (मेमोरी लोकेशन) तक पहुंचते हैं।

अधिकांश समय चाल यह है कि आपके पास समर्पित ताले नहीं हैं - इसके बजाय आप किसी सरणी में सभी तत्वों को या किसी लिंक वाली सूची में सभी नोड्स को "स्पिन-लॉक" के रूप में मानते हैं। यदि आपने अपने पिछले पढ़ने के बाद से कोई अपडेट नहीं किया था, तो आप पढ़ते हैं, संशोधित करते हैं और अपडेट करने का प्रयास करते हैं। अगर वहाँ था, तो आप पुनः प्रयास करते हैं।
यह आपकी "लॉकिंग" बनाता है (ओह, सॉरी, नॉन-लॉकिंग :) बहुत ही महीन दाने वाला, बिना अतिरिक्त मेमोरी या संसाधन की आवश्यकता के।
इसे और अधिक बारीक बनाने से वेट की संभावना कम हो जाती है। अतिरिक्त संसाधन आवश्यकताओं को शुरू किए बिना इसे जितना संभव हो उतना बढ़िया बनाया जाना, बहुत अच्छा लगता है, है ना?

हालांकि अधिकांश मज़े सही लोड / स्टोर ऑर्डरिंग सुनिश्चित करने से आ सकते हैं ।
किसी के अंतर्विरोधों के विपरीत, सीपीयू मेमोरी रीड / रिडर करने के लिए स्वतंत्र हैं - वे बहुत स्मार्ट हैं, वैसे: आपके पास एक एकल थ्रेड से इसे देखने में कठिन समय होगा। हालाँकि, जब आप कई कोर पर मल्टी-थ्रेडिंग करना शुरू करते हैं तो आप मुद्दों में भाग लेंगे। आपका अंतर्ज्ञान टूट जाएगा: सिर्फ इसलिए कि एक निर्देश आपके कोड में पहले से है, इसका मतलब यह नहीं है कि यह वास्तव में पहले होगा। सीपीयू निर्देश को आदेश से बाहर कर सकते हैं: और वे विशेष रूप से मेमोरी एक्सेस के निर्देशों के लिए ऐसा करना पसंद करते हैं, मुख्य मेमोरी विलंबता को छिपाने और अपने कैश का बेहतर उपयोग करने के लिए।

अब, यह अंतर्ज्ञान के खिलाफ निश्चित है कि कोड का एक क्रम "टॉप-डाउन" प्रवाह नहीं करता है, इसके बजाय यह चलता है जैसे कि कोई अनुक्रम नहीं था - और "शैतान का खेल का मैदान" कहा जा सकता है। मेरा मानना ​​है कि इस बात का सटीक उत्तर देना उचित है कि क्या लोड / स्टोर री-ऑर्डर होंगे। इसके बजाय, एक हमेशा के संदर्भ में बात करते हैं Mays और mights और डिब्बे और सबसे खराब के लिए तैयार करते हैं। "ओह, हो सकता है कि सीपीयू इस रीड को लिखने से पहले आने के लिए फिर से करे, इसलिए मेमोरी बैरियर को यहीं, इस मौके पर लगाना सबसे अच्छा है।"

मामले इस तथ्य से जटिल हैं कि यहां तक ​​कि ये मेस और मैट्स सीपीयू आर्किटेक्चर में भिन्न हो सकते हैं। उदाहरण के लिए, ऐसा हो सकता है कि एक वास्तुकला में ऐसा न होने की गारंटी हो


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

.NET में ताले एक अंतर्निहित मेमोरी बैरियर का परिणाम देते हैं, इसलिए आप उनका उपयोग कर रहे हैं (ज्यादातर समय, यही है ... उदाहरण के लिए देखें यह जो डफी - ब्रैड एबर्स - लाज़ इनिशियलाइज़ेशन, लॉक्स, वॉल्वाइल और मेमोरी पर वैन्स मॉरिसन महानता। बाधाओं। :) (उस पृष्ठ पर लिंक का पालन करना सुनिश्चित करें।)

एक अतिरिक्त बोनस के रूप में, आपको .NET मेमोरी मॉडल एक साइड सर्च पर मिल जाएगा । :)

Vance Morrison से एक "पुराना लेकिन गोल्डी" भी है: मल्टीथ्रेडेड ऐप्स के बारे में हर देव को पता होना चाहिए

... और निश्चित रूप से, जैसा कि @ उल्लेख किया गया है, जो डफी विषय पर एक निश्चित पढ़ा है।

एक अच्छा एसटीएम ठीक-ठाक लॉकिंग के करीब पहुंच सकता है, जैसा कि यह हो जाता है और संभवतः एक प्रदर्शन प्रदान करेगा जो हाथ से बने कार्यान्वयन के साथ या बराबर है। उनमें से एक है STM.NET से DevLabs परियोजनाओं एमएस की।

यदि आप .NET-केवल zealot नहीं हैं, तो डॉग ली ने JSR-166 में कुछ बेहतरीन काम किया
क्लिफ क्लिक में हैश टेबल्स पर एक दिलचस्प जानकारी दी गई है जो लॉक-स्ट्रिपिंग पर निर्भर नहीं करती है - जैसा कि जावा और .NET समवर्ती हैश टेबल करते हैं - और 750 सीपीयू तक अच्छी तरह से स्केल करते हैं।

यदि आप लिनक्स क्षेत्र में उद्यम करने से डरते नहीं हैं, तो निम्नलिखित लेख वर्तमान मेमोरी आर्किटेक्चर के इंटर्न में अधिक अंतर्दृष्टि प्रदान करता है और कैश-लाइन साझाकरण प्रदर्शन को कैसे नष्ट कर सकता है: प्रत्येक प्रोग्रामर को स्मृति के बारे में क्या जानना चाहिए

@ ने MPI के बारे में कई टिप्पणियां कीं: मैं पूरी तरह सहमत हूं कि MPI कुछ क्षेत्रों में चमक सकता है। एक MPI आधारित समाधान के बारे में तर्क करना आसान हो सकता है, लागू करने में आसान हो सकता है और एक आधे-बेक्ड लॉकिंग कार्यान्वयन की तुलना में कम त्रुटि-प्रवण हो सकता है जो स्मार्ट होने की कोशिश करता है। (हालांकि यह - विषयगत रूप से - एसटीएम आधारित समाधान के लिए भी सच है।) मैं यह भी शर्त लगाऊंगा कि प्रकाश-वर्ष आसान है जैसे कि एर्लांग में एक सभ्य वितरित एप्लिकेशन को सही ढंग से लिखना आसान है , जैसा कि कई सफल उदाहरण बताते हैं।

MPI, हालांकि इसकी अपनी लागत और अपनी परेशानी है, जब इसे एकल, मल्टी-कोर सिस्टम पर चलाया जा रहा है । उदाहरण के लिए, इरलांग में, प्रक्रिया निर्धारण और संदेश कतारों के सिंक्रनाइज़ेशन के आसपास हल किए जाने वाले मुद्दे हैं ।
इसके अलावा, उनके मूल में, MPI सिस्टम आमतौर पर "लाइटवेट प्रोसेस" के लिए एक प्रकार का सहकारी N: M शेड्यूलिंग लागू करते हैं। उदाहरण के लिए इसका मतलब है कि हल्के प्रक्रियाओं के बीच एक अपरिहार्य संदर्भ स्विच है। यह सच है कि यह "क्लासिक संदर्भ स्विच" नहीं है, लेकिन ज्यादातर उपयोगकर्ता अंतरिक्ष ऑपरेशन है और इसे तेजी से बनाया जा सकता है - हालांकि मुझे पूरी तरह से संदेह है कि इसे 20-200 चक्रों के तहत एक इंटरलॉक किए गए ऑपरेशन में लाया जा सकता है । उपयोगकर्ता-मोड संदर्भ स्विचिंग निश्चित रूप से धीमी हैइंटेल McRT पुस्तकालय में भी। एन: हल्के वजन प्रक्रियाओं के साथ एम समयबद्धन नया नहीं है। एलडब्ल्यूपी लंबे समय से सोलारिस में थे। उन्हें छोड़ दिया गया। NT में फाइबर थे। वे अब एक अवशेष हैं। NetBSD में "सक्रियण" थे। उन्हें छोड़ दिया गया। लिनक्स का N: M थ्रेडिंग के विषय पर अपना खुद का टेक था। लगता है अब तक कुछ मर चुका होगा।
समय-समय पर, नए दावेदार होते हैं: उदाहरण के लिए इंटेल से मैकआरटी , या हाल ही में माइक्रोसॉफ्ट से कॉनक्रैट के साथ उपयोगकर्ता-मोड निर्धारण । सबसे निचले स्तर पर, वे वही करते हैं जो N: M MPI शेड्यूलर करता है। Erlang - या कोई भी MPI सिस्टम -, नए UMS का फायदा उठाकर SMP सिस्टम पर बहुत फायदा पहुंचा सकता है ।

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

वितरित प्रणाली के निर्माण के लिए, एक MPI प्रणाली शायद एक प्राकृतिक विकल्प बनाती है।
ध्यान दें कि .NET के लिए MPI कार्यान्वयन भी हैं (हालांकि वे उतना सक्रिय नहीं हैं)।


1
हालांकि इस उत्तर में बहुत सारी अच्छी जानकारी है, शीर्षक का विचार है कि लॉक-फ्री एल्गोरिदम और डेटा संरचनाएं अनिवार्य रूप से बहुत महीन दाने वाले स्पिनलॉक का संग्रह गलत हैं। जब आप आमतौर पर लॉक-मुक्त संरचनाओं में रिट्री लूप देखेंगे, तो व्यवहार बहुत अलग है: ताले (स्पिनलॉक सहित) विशेष रूप से कुछ संसाधन प्राप्त करते हैं और अन्य थ्रेड प्रगति नहीं कर सकते जबकि यह आयोजित होता है। इस अर्थ में "रिट्री" केवल विशेष संसाधन जारी होने की प्रतीक्षा कर रहा है।
BeeOnRope

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

1
... लेकिन यह निश्चित रूप से अच्छा स्केलिंग नहीं है: एक मेमोरी स्थान के लिए विवाद हमेशा एसएमपी मशीनों पर काफी धीमा होने वाला है, बस इंटर-कोर इंटर-सॉकेट विलंबता के कारण, भले ही कैस विफलताओं की संख्या हो। कम।
बीयॉनरोप

1
@AndrasVass - मुझे लगता है कि यह "अच्छा" बनाम "बुरा" लॉक-फ्री कोड पर भी निर्भर करता है। निश्चित रूप से कोई भी संरचना लिख ​​सकता है और इसे लॉक-फ्री कह सकता है, जबकि यह वास्तव में केवल एक उपयोगकर्ता-मोड स्पिनलॉक का उपयोग करता है और परिभाषा भी पूरा नहीं करता है। मैं किसी भी इच्छुक पाठकों को इस पेपर की जांच करने के लिए प्रोत्साहित करूंगा जिसमें हेरली और शविट शामिल हैं जो लॉक-आधारित और लॉक-फ्री एल्गोरिदम की विभिन्न श्रेणियों में औपचारिक रूप से दिखता है। इस विषय पर हेरलीह द्वारा कुछ भी पढ़ने की सिफारिश की जाती है।
BeeOnRope

1
@AndrasVass - मैं असहमत हूं। क्लासिक लॉक-फ्री संरचनाओं (सूचियों, कतारों, समवर्ती नक्शे, आदि) के अधिकांश में साझा किए गए परिवर्तनशील संरचनाओं के लिए भी कोई कताई नहीं थी, और उसी में व्यावहारिक मौजूदा कार्यान्वयन, उदाहरण के लिए, जावा समान पैटर्न का पालन करता है (मैं जैसा नहीं हूं। देशी-संकलित C या C ++ में क्या उपलब्ध है, इससे परिचित है और यह कचरा संग्रह के कारण वहां कठिन है)। शायद आपके और मेरे पास कताई की एक अलग परिभाषा है: मैं "कैस-रिट्री" पर विचार नहीं करता हूं जो आपको लॉक-फ्री सामान "कताई" में मिलता है। IMO "कताई" का तात्पर्य गर्म-प्रतीक्षा से है।
BeeOnRope

27

जो डफी की पुस्तक:

http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html

वह इन विषयों पर एक ब्लॉग भी लिखते हैं।

कम-लॉक प्रोग्राम को सही करने की चाल को एक गहरे स्तर पर समझना ठीक है कि मेमोरी मॉडल के नियम हार्डवेयर, ऑपरेटिंग सिस्टम और रनटाइम वातावरण के आपके विशेष संयोजन पर क्या हैं।

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


38
तो अगर एरिक लिपर्ट और जॉन स्कीट दोनों को लगता है कि लॉक फ्री प्रोग्रामिंग केवल अपने से ज्यादा स्मार्ट लोगों के लिए है, तो मैं विनम्रतापूर्वक विचार से तुरंत चिल्लाकर भाग जाऊंगा। ;-)
dodgy_coder 7

20

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

दो विकासों ने इसे समाप्त कर दिया है: रैम और सीपीयू की गति के बीच बढ़ती असमानता। और चिप निर्माताओं की एक चिप पर एक से अधिक सीपीयू कोर लगाने की क्षमता।

रैम स्पीड की समस्या के कारण चिप डिजाइनरों को सीपीयू चिप पर बफर लगाने की आवश्यकता होती है। सीपीयू कोर द्वारा बफर कोड और डेटा, जल्दी से सुलभ है। और ज्यादा धीमी दर पर / RAM से पढ़ा / लिखा जा सकता है। इस बफ़र को सीपीयू कैश कहा जाता है, अधिकांश सीपीयू में से कम से कम दो हैं। पहला स्तर कैश छोटा और तेज़ है, दूसरा बड़ा और धीमा है। जब तक सीपीयू 1 स्तर के कैश से डेटा और निर्देश पढ़ सकता है तब तक यह तेजी से चलेगा। एक कैश मिस वास्तव में महंगा है, यह सीपीयू को 10 चक्रों तक सोने के लिए रखता है यदि डेटा 1 कैश में नहीं है, तो 200 चक्रों के रूप में कई अगर यह 2 कैश में नहीं है और इसे पढ़ने की आवश्यकता है राम।

हर सीपीयू कोर का अपना कैश होता है, वे रैम के अपने "व्यू" को स्टोर करते हैं। जब सीपीयू डेटा लिखता है तो राइट को कैश कर दिया जाता है जो तब, धीरे-धीरे, रैम में फ्लश हो जाता है। अपरिहार्य, प्रत्येक कोर में अब रैम सामग्री का एक अलग दृष्टिकोण होगा। दूसरे शब्दों में, एक सीपीयू को यह नहीं पता होता है कि एक अन्य सीपीयू ने क्या लिखा है जब तक कि रैम लिखना चक्र पूरा न हो जाए और सीपीयू अपने स्वयं के दृश्य को ताज़ा करता है।

यह नाटकीय रूप से थ्रेडिंग के साथ असंगत है। तुम हमेशा सच में परवाह एक और धागा की स्थिति है क्या जब आप डेटा है कि एक और धागा द्वारा लिखा गया था अवश्य पढ़ें। यह सुनिश्चित करने के लिए, आपको एक तथाकथित मेमोरी बैरियर को स्पष्ट रूप से प्रोग्राम करने की आवश्यकता है। यह एक निम्न-स्तरीय सीपीयू आदिम है जो यह सुनिश्चित करता है कि सभी सीपीयू कैश एक सुसंगत स्थिति में हैं और रैम के लिए अद्यतित हैं। सभी लंबित लेखों को RAM में फ्लश किया जाना है, फिर कैश को ताज़ा करने की आवश्यकता है।

यह .NET, थ्रेड में उपलब्ध है। MemoryBarrier () विधि एक को लागू करती है। यह देखते हुए कि यह 90% काम है जो लॉक स्टेटमेंट (और निष्पादन समय का 95%) करता है, आप बस उन उपकरणों से बचते हुए आगे नहीं हैं जो .NET आपको देता है और अपने स्वयं के कार्यान्वयन की कोशिश कर रहा है।


2
@ डेवी 8: रचना इसे अभी भी कठिन बना देती है। यदि मेरे पास दो लॉक-फ्री हैश-टेबल हैं और एक उपभोक्ता के रूप में मैं उन दोनों को एक्सेस करता हूं, तो यह समग्र रूप से राज्य की स्थिरता की गारंटी नहीं देगा। निकटतम आप आज आ सकते हैं एसटीएम हैं जहां आप एक ही atomicब्लॉक में दो पहुंच जैसे डाल सकते हैं । सभी सभी, लॉक-फ्री संरचनाओं का उपभोग करना कई मामलों में मुश्किल हो सकता है।
एंड्रास वास

4
मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि आपने गलत तरीके से समझाया है कि कैश सुसंगतता कैसे काम करती है। अधिकांश आधुनिक मल्टीकोर प्रोसेसर में सुसंगत कैश होते हैं, जिसका अर्थ है कि कैश हार्डवेयर यह सुनिश्चित करता है कि सभी प्रक्रियाओं में रैम सामग्री का एक ही दृश्य हो - "रीड" कॉल को तब तक अवरुद्ध करें जब तक कि सभी "लिख" कॉल पूरी न हो जाएं। The Thread.MemoryBarrier () प्रलेखन ( msdn.microsoft.com/en-us/library/… ) कैश व्यवहार के बारे में कुछ भी नहीं कहता है - यह केवल एक निर्देश है जो प्रोसेसर को रीडर्स लिखने और लिखने से रोकता है।
ब्रूक्स मूसा

7
"इन दिनों" लॉक-फ्री थ्रेडिंग "जैसी कोई चीज नहीं है।" बता दें कि एर्लांग और हास्केल प्रोग्रामर हैं।
जूलियट

4
@ हंसपसंद: "इन दिनों 'लॉक-फ़्री थ्रेडिंग' जैसी कोई चीज़ नहीं है।" F #, एरलैंग, हास्केल, Cilk, OCaml, Microsoft का टास्क पैरेलल लाइब्रेरी (TPL) और इंटेल का थ्रेडेड बिल्डिंग ब्लॉक्स (TBB) सभी लॉक-फ्री मल्टीथ्रेडेड प्रोग्रामिंग को प्रोत्साहित करते हैं। मैं इन दिनों शायद ही कभी उत्पादन कोड में ताले का उपयोग करता हूं।
JD

5
@ हंसपैंट: "एक तथाकथित मेमोरी बैरियर। यह एक निम्न-स्तर का सीपीयू आदिम है जो यह सुनिश्चित करता है कि सभी सीपीयू कैश एक सुसंगत स्थिति में हैं और रैम के लिए अद्यतित हैं। सभी लंबित राइट्स को रैम में फ्लश करना है। कैश को फिर से ताज़ा करने की आवश्यकता है ”। इस संदर्भ में एक मेमोरी बैरियर मेमोरी निर्देश (लोड और स्टोर) को कंपाइलर या सीपीयू द्वारा पुन: व्यवस्थित होने से रोकता है। सीपीयू कैश की निरंतरता के साथ कुछ नहीं करना है।
JD

6

Google मुफ्त डेटा संरचनाओं और सॉफ़्टवेयर ट्रांसेक्शनल मेमोरी के लिए लॉक

मैं इस पर जॉन स्कीट के साथ सहमत हूँ; लॉक-फ़्री थ्रेडिंग शैतान का खेल का मैदान है, और सबसे अच्छे लोगों के लिए छोड़ दिया जाता है जो जानते हैं कि उन्हें पता है कि उन्हें क्या जानना है।


0

जब मल्टी-थ्रेडिंग की बात आती है, तो आपको यह जानना होगा कि आप क्या कर रहे हैं। मेरा मतलब है कि जब आप एक बहु-थ्रेडेड वातावरण में काम कर रहे हैं तो सभी संभावित परिदृश्यों / मामलों का पता लगा सकते हैं। लॉक-फ्री मल्टीथ्रेडिंग एक पुस्तकालय या एक वर्ग नहीं है जिसे हम शामिल करते हैं, इसका ज्ञान / अनुभव जो हम धागे पर अपनी यात्रा के दौरान कमाते हैं।


कई पुस्तकालय हैं जो लॉक-फ्री थ्रेडिंग शब्दार्थ प्रदान करते हैं। एसटीएम विशेष रुचि का है, जिसके आसपास काफी संख्या में कार्यान्वयन हैं।
मार्सेलो कैंटोस

मैं इस एक के दोनों किनारों को देखता हूं। लॉक-फ्री लाइब्रेरी से प्रभावी प्रदर्शन प्राप्त करने के लिए मेमोरी मॉडल के गहन ज्ञान की आवश्यकता होती है। लेकिन एक प्रोग्रामर जिसके पास वह ज्ञान नहीं है, वह अब भी शुद्धता के फायदे से लाभान्वित हो सकता है।
बेन वोइगट

0

भले ही लॉक-फ्री थ्रेडिंग .NET में मुश्किल हो सकती है, लेकिन अक्सर लॉक का उपयोग करके, और लॉक किए गए सेक्शन को न्यूनतम करने का अध्ययन करके आप महत्वपूर्ण सुधार कर सकते हैं ... इसे लॉक ग्रैन्युलैरिटी को कम करने के रूप में भी जाना जाता है ।

एक उदाहरण के रूप में, बस यह कहें कि आपको एक संग्रह धागा सुरक्षित बनाने की आवश्यकता है। अगर यह प्रत्येक आइटम पर कुछ सीपीयू-गहन कार्य करता है, तो संग्रह पर दिखाई देने वाली विधि के चारों ओर केवल आंख बंद करके न रखें। आपको संग्रह की उथली प्रति बनाने के लिए केवल एक ताला लगाने की आवश्यकता हो सकती है । कॉपी पर फेरबदल तब बिना लॉक के काम कर सकता था। बेशक यह आपके कोड की बारीकियों पर अत्यधिक निर्भर है, लेकिन मैं इस दृष्टिकोण के साथ लॉक काफिले के मुद्दे को ठीक करने में सक्षम हूं ।

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