2009-07-07 8 views

उत्तर

98

संख्या। इसका उपयोग बहुत ही अल्पकालिक नींद कॉल के प्रतिस्थापन के रूप में किया जाता है।

जब आप बहु लड़ी ताला करते हैं, यदि संसाधन आप प्राप्त करने के लिए प्रयास कर रहे हैं पहले से ही बंद कर दिया है, तो आप आम तौर पर सोने और यह मुफ़्त बनने के लिए के लिए प्रतीक्षा करने के लिए जाना। जब आप ऐसा करते हैं, तो आप प्रोसेसर का उपयोग करने के लिए शेड्यूलर द्वारा आवंटित किए गए शेष समय को छोड़ देते हैं ताकि कोई और जा सके। आम तौर पर यह ठीक है, विशेष रूप से लंबी प्रतीक्षा के लिए, आईओ की प्रतीक्षा करने की तरह, अन्य प्रक्रियाओं का भार सीपीयू पर चल सकता है जबकि आप डिस्क स्पिंडल घूमने की प्रतीक्षा कर रहे हैं।

हालांकि, कभी-कभी, आप थोड़े समय के लिए प्रतीक्षा कर रहे हैं। इन मामलों में, आप सामान्य रूप से अपना शेष समय छोड़ देंगे और अन्य सभी थ्रेडों को एक और जाने से पहले अपनी बात करने के लिए इंतजार करेंगे .. इसलिए आप प्रतीक्षा करने के बजाय धोखा दे सकते हैं, आप वहां लगातार मतदान करते हैं 'क्या हम लगभग वहाँ अभी तक?' मार्ग। यदि ताला केवल आपके शेष समय के अंश के लिए आयोजित किया जाता है, तो यह प्रतीक्षा करने का एक बहुत ही प्रभावी माध्यम बन जाता है, यह भी बहुत ही कुशल है क्योंकि शेड्यूलर को आपके द्वारा छोड़े जाने वाले समय का उपयोग करने के लिए अन्य सभी धागे को पुन: व्यवस्थित करने में शामिल नहीं होना पड़ता है यदि आप सामान्य रूप से इंतजार कर रहे थे।

जाहिर है, यदि आप हर बार लॉक चाहते हैं तो आप स्पिन करते हैं, तो आप बहुत लोकप्रिय नहीं होंगे, आपका ऐप सुस्त हो जाएगा और 100% सीपीयू का उपयोग करेगा, लेकिन बहुत कम खुराक में, यह सही समय पर बनाता है ऐप अधिक प्रतिक्रियाशील।

यदि आप अब सोच रहे हैं कि 'मुझे इसका उपयोग कब करना चाहिए?', यह एक मुश्किल कॉल है - यदि आपके पास ऐसा संसाधन है जो अक्सर लॉक हो जाता है और बहुत जल्दी अनलॉक हो जाता है, तो प्रतीक्षा के बजाय उसके आसपास एक स्पिनलॉक एक अच्छा विचार है (और फिर प्रदर्शन के लिए अपने ऐप का परीक्षण करें), यदि आप थोड़े समय के लिए कताई करने का प्रयास करते हैं, और फिर सामान्य प्रतीक्षा पर वापस आते हैं, तो यह भी एक उचित तरीका है। लेकिन आम तौर पर, आपको इसे कभी भी उपयोग करने की आवश्यकता नहीं होगी।

+0

कहें कि हम औसतन 50 एमएमएस देरी हासिल करना चाहते हैं, हम कितने पुनरावृत्तियों को करते हैं निर्दिष्ट करें? –

+3

'स्पिनवाइट' शायद ही कभी आपको 100% सीपीयू उपयोग पर फंसने का कारण बनता है। ऐसा इसलिए होता है क्योंकि यह थ्रेड पैदा करने या नींद के कारण बहुत लंबे समय तक फैलता है। विशेष रूप से, यदि स्पिन की संख्या अधिक या बराबर होती है 10 तक, यह हर 1 9वीं स्पिन के लिए 'नींद (1)' और प्रत्येक 4 वें स्पिन के लिए 'नींद (0) 'और' उपज 'होगी, और अगर केवल अगले स्पिन को संभावित क्षमता प्राप्त करने के लिए निर्धारित किया जाता है तो यह' सो 'होगा। या बहु-प्रोसेसर सिस्टम पर 'उपज' किसी भी बिंदु और प्रारंभिक 10 स्पिन के लिए इंतजार करने की आवश्यकता नहीं है। एक प्रोसेसर सिस्टम पर, अगर स्पिन गिनती 10 या उससे कम हो तो यह केवल 'नींद' या 'उपज' होगी। –

+3

@ माइकल जे। ग्रे: आप 'var sw = new spinWait() के साथ 'थ्रेड। पिनवाइट()' (प्रश्न और उत्तर) को भ्रमित कर रहे हैं; sw.SpinOnce(); 'जो आंतरिक स्पिन गिनती 10 तक करता है ... – DeepSpace101

70

इसका उद्देश्य "सस्ता" इंतजार करना है यदि आप मानते हैं कि जिस स्थिति का आप इंतजार कर रहे हैं वह सच होगा बहुत जल्द,। आम तौर पर यदि आप किसी चीज़ की प्रतीक्षा कर रहे हैं, तो आप धागे को सोने के लिए जाने दें और प्रोसेसर/ओएस संदर्भ दूसरे धागे पर स्विच करेगा। संदर्भ स्विच विशेष रूप से सस्ते नहीं होते हैं, इसलिए यदि आपके पास स्थिति का उन्नत ज्ञान है और मानते हैं कि संदर्भ स्विच की तुलना में प्रतीक्षा करना सस्ता है, तो आप प्रतीक्षा करें।

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

+3

मुझे लगता है कि यह एक जब तक आप मापा जाता है और वहाँ पाया एक समस्या है "के पूरे वर्ग के साथ चला जाता ..." – jerryjvl

5

जहां तक ​​मेरा सवाल है (और मैं सुधार के लिए खुश हूँ!), स्पिन का केवल उपयोग इंतजार कर रहा है जब एक ताला या अंतर-धागा-कॉलबैक तंत्र को लागू है। और न ही मैन्युअल रूप से (आमतौर पर) किया जाना चाहिए, क्योंकि वे पहले से मौजूद हैं।

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

+2

एक अपवाद - फ्रेम इंजन को रेट करने के लिए गेम इंजन के 'रेंडर()' चक्र के अंदर। अन्य 'नींद()' तंत्र में से कोई भी इस बारे में पर्याप्त गारंटी प्रदान करता है कि आपको वापस कब स्विच किया जाएगा। – Basic

+2

@ बेसिक सच है कि अक्सर क्या किया जाता है यह है कि आप एक स्पष्ट (नेस्टेड) ​​प्रतीक्षा लूप होने के बजाय रेंडर चक्र में गोद छोड़ते हैं। प्रभाव बिल्कुल वही है। –

14

एक तरफ ध्यान दें, माइक्रोसॉफ्ट के रूप में, विंडोज 7 से धागा डिस्पैचर spinlock तंत्र से छुटकारा मिल गया है के बाद से यह मल्टीकोर CPU के लिए अच्छी तरह से बड़े पैमाने नहीं किया। this पर एक नज़र डालें:

+1

यह कहता है कि वे विंडोज़ में एक स्पिनलॉक से छुटकारा पा चुके हैं - प्रेषक स्पिनलॉक। – Kevin

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