अधिकांश भाषाओं/ढांचे में, थ्रेड के लिए अन्य धागे पर नियंत्रण उत्पन्न करने का एक तरीका मौजूद है। हालांकि, मैं वास्तव में उस समय के बारे में सोच नहीं सकता जब थ्रेड से उपज किसी दिए गए समस्या का सही समाधान था। जब, सामान्य रूप से, Thread.yield()
, sleep(0)
, आदि का उपयोग करना चाहिए?जब धागे आम तौर पर उपज चाहिए?
उत्तर
समवर्ती कार्यक्रमों का परीक्षण करने के लिए एक उपयोग का मामला हो सकता है, अपने सिंक्रनाइज़ेशन पैटर्न में त्रुटियों को प्रकट करने वाले इंटरलीविंग्स को खोजने का प्रयास करें। जावा में उदाहरण के लिए:
इसलिए interleavings की संख्या, और बढ़ती अधिक प्रभावी ढंग से अपने कार्यक्रमों के राज्य अंतरिक्ष की खोज के लिए एक उपयोगी चाल, उपयोग
Thread.yield
है और अधिक संदर्भ प्रोत्साहित करने के लिए कार्य है कि पहुंच के दौरान स्विच साझा राज्य। ( तकनीक की प्रभावशीलता प्लेटफ़ॉर्म-विशिष्ट है, क्योंकि JVM THRead.yield को नो-ऑप [जेएलएस 17.9] के रूप में इलाज करने के लिए स्वतंत्र है; एक छोटी लेकिन गैर-नींद नींद धीमा लेकिन अधिक विश्वसनीय होगा।) - JCIP
भी देखने के जावा बिंदु से दिलचस्प है कि उनके अर्थ विज्ञान से परिभाषित नहीं कर रहे हैं:
की
Thread.yield
(औरThread.sleep(0)
) अपरिभाषित हैं अर्थ विज्ञान [JLS 17.9]; जेवीएम उन्हें नो-ऑप्स के रूप में लागू करने के लिए स्वतंत्र है या को शेड्यूलिंग संकेतों के रूप में उनका इलाज करता है। विशेष रूप से, यूनिक्स सिस्टमपूट पर नींद (0) के अर्थशास्त्र की आवश्यकता नहीं है, उस प्राथमिकता के लिए रन कतार के पर वर्तमान थ्रेड, के अन्य धागे को समान प्राथमिकता देना हालांकि कुछ JVMs उपज को लागू करते हैं इस तरफ। - JCIP
यह निश्चित रूप से अविश्वसनीय बनाता है। यह बहुत जावा विशिष्ट है, तथापि, आम तौर पर मैं निम्नलिखित विश्वास में सत्य है:
दोनों निम्न स्तर व्यवस्था है जिसके शेड्यूलिंग आदेश प्रभावित करने के लिए इस्तेमाल किया जा सकता है। यदि इसका उपयोग एक निश्चित कार्यक्षमता प्राप्त करने के लिए किया जाता है तो यह कार्यक्षमता ओएस शेड्यूलर की संभावना पर आधारित होती है जो एक बुरा विचार प्रतीत होता है। इसे इसके बजाय उच्च स्तरीय सिंक्रनाइज़ेशन संरचनाओं द्वारा प्रबंधित किया जाना चाहिए।
परीक्षण के उद्देश्य के लिए या किसी निश्चित स्थिति में प्रोग्राम को मजबूर करने के लिए यह एक आसान टूल लगता है।
अपने ओएस शेड्यूलर को आपके लिए तय रखें?
तो कभी भी उपज न करें, और कभी सोएं (0) जब तक आप किसी ऐसे मामले से मेल नहीं खाते जहां नींद (0) पूरी तरह से जरूरी है और इसे यहां दस्तावेज करें।
इसके अलावा संदर्भ स्विच महंगा है इसलिए मुझे नहीं लगता कि बहुत से लोग अधिक संदर्भ स्विच चाहते हैं।
'तो कभी भी उपज न करें, और कभी सोएं (0) जब तक कि आप ऐसे मामले से मेल नहीं खाते जहां नींद (0) पूरी तरह से जरूरी है और इसे यहां दस्तावेज करें।' - क्या हम एक साथ बाबा बना सकते हैं? (मै पुरुष हूँ)। –
सामान्य रूप से, क्या किसी को थ्रेड.इल्ड(), नींद (0) आदि का उपयोग करना चाहिए?
यह वीएम पर निर्भर करता है कि हम थ्रेड मॉडल के बारे में बात कर रहे हैं।मेरे लिए जवाब शायद ही कभी है।
परंपरागत रूप से कुछ धागा मॉडल गैर रिक्तिपूर्व थे और दूसरों रहे हैं (या थे) इसलिए Thread.yield()
के लिए की जरूरत परिपक्व नहीं।
मुझे लगता है कि Thread.yield()
सी में register
का उपयोग कर हम क्योंकि कई मामलों प्रोग्रामर संकलक की तुलना में इस पर बेहतर था में उस पर भरोसा करने के लिए हमारे कार्यक्रमों के प्रदर्शन में सुधार करने के लिए इस्तेमाल की तरह है। लेकिन आधुनिक compilers ज्यादा चालाक और बहुत कम मामलों में इन दिनों प्रोग्रामर वास्तव में register
और Thread.yield()
के उपयोग के साथ एक कार्यक्रम के प्रदर्शन में सुधार कर सकते हैं।
वापस जब मैं एकल-टास्किंग सिस्टम के ऊपर मल्टी-थ्रेडेड कर्नेल लिखने के लिए प्रयोग किया जाता है, मैं वास्तव में इस उद्देश्य के लिए टाइलस्लाइस अवधि नियंत्रित करने के लिए डीबगिंग टूल था। यह आश्चर्यजनक है कि जब आप प्रत्येक कुछ मशीन निर्देशों को प्रीपेप्टिव अनइस्पेच को मजबूर करते हैं तो कितना अनुमानित-थ्रेड-सुरक्षित कोड क्रैश हो जाएगा। उस दर पर कुछ भी उपयोगी नहीं होता है, लेकिन आपको यकीन है कि बग मिलते हैं! –
@RossPatterson अभ्यास में इसके बारे में सुनकर बहुत अच्छा लगा। –