VB.NET में थ्रेडिंग को समझने के लिए, यह कुछ नींव अवधारणाओं को समझने में मदद करता है। पहली बात यह है कि थ्रेडिंग एक ऐसी चीज है जो होती है क्योंकि ऑपरेटिंग सिस्टम इसका समर्थन करता है। Microsoft Windows एक पूर्व-खाली मल्टीटास्किंग ऑपरेटिंग सिस्टम है। विंडोज के एक हिस्से को टास्क शेड्यूलर कहा जाता है जो सभी चल रहे कार्यक्रमों के लिए प्रोसेसर समय को पार्सल करता है। प्रोसेसर समय के इन छोटे टुकड़ों को टाइम स्लाइस कहा जाता है। प्रोग्राम के प्रभारी नहीं हैं कि उन्हें प्रोसेसर समय कितना मिलता है, कार्य अनुसूचक है। क्योंकि ये समय स्लाइस बहुत छोटा होता है, इसलिए आपको भ्रम हो जाता है कि कंप्यूटर एक साथ कई काम कर रहा है।
थ्रेड की परिभाषा
एक धागा नियंत्रण का एकल अनुक्रमिक प्रवाह है।
कुछ क्वालिफायर:
- एक धागा कोड के उस निकाय के माध्यम से "निष्पादन का मार्ग" है।
- थ्रेड्स मेमोरी को साझा करते हैं ताकि उन्हें सही परिणाम उत्पन्न करने के लिए सहयोग करना पड़े।
- एक थ्रेड में थ्रेड-विशिष्ट डेटा होते हैं जैसे रजिस्टर, एक स्टैक पॉइंटर और एक प्रोग्राम काउंटर।
- एक प्रक्रिया कोड का एक एकल निकाय है जिसमें कई धागे हो सकते हैं, लेकिन इसमें कम से कम एक है और इसका एक संदर्भ (पता स्थान) है।
यह असेंबली स्तर का सामान है, लेकिन जब आप थ्रेड्स के बारे में सोचना शुरू करते हैं, तो यह आपको मिलता है।
मल्टीथ्रेडिंग बनाम। बहु
बहु सूत्रण मल्टीकोर समानांतर प्रसंस्करण के समान नहीं है, लेकिन मल्टीथ्रेडिंग और मल्टीप्रोसेसिंग एक साथ काम करते हैं। अधिकांश पीसी में आज ऐसे प्रोसेसर होते हैं जिनमें कम से कम दो कोर होते हैं, और साधारण घरेलू मशीनों में कभी-कभी आठ कोर तक होते हैं। प्रत्येक कोर एक अलग प्रोसेसर है, जो अपने आप प्रोग्राम चलाने में सक्षम है। जब OS एक अलग प्रक्रिया को अलग-अलग कोर में असाइन करता है तो आपको एक प्रदर्शन को बढ़ावा मिलता है। कई थ्रेड और कई प्रोसेसर का उपयोग और भी अधिक प्रदर्शन के लिए, थ्रेड-लेवल समानता को कहा जाता है।
जो कुछ किया जा सकता है वह इस बात पर निर्भर करता है कि ऑपरेटिंग सिस्टम और प्रोसेसर हार्डवेयर क्या कर सकते हैं, नहीं हमेशा आप अपने कार्यक्रम में क्या कर सकते हैं, और आपको कई थ्रेड्स का उपयोग करने में सक्षम होने की उम्मीद नहीं करनी चाहिए सब कुछ। वास्तव में, आपको कई समस्याएं नहीं मिल सकती हैं जो कई थ्रेड्स से लाभ उठाती हैं। इसलिए, मल्टीथ्रेडिंग को सिर्फ इसलिए लागू न करें क्योंकि यह वहां है। यदि आप मल्टीथ्रेडिंग के लिए अच्छे उम्मीदवार नहीं हैं, तो आप आसानी से अपने कार्यक्रम के प्रदर्शन को कम कर सकते हैं। उदाहरण के रूप में, वीडियो कोडेक्स सबसे खराब प्रोग्राम हो सकते हैं क्योंकि डेटा स्वाभाविक है धारावाहिक. सर्वर प्रोग्राम जो वेब पेजों को संभालते हैं वे सबसे अच्छे हो सकते हैं क्योंकि विभिन्न क्लाइंट स्वाभाविक रूप से स्वतंत्र होते हैं।
थ्रेड सुरक्षा का अभ्यास करना
बहुस्तरीय कोड को अक्सर थ्रेड्स के जटिल समन्वय की आवश्यकता होती है। सूक्ष्म और मुश्किल-से-ज्ञात बग आम हैं क्योंकि विभिन्न थ्रेड्स में अक्सर एक ही डेटा साझा करना होता है ताकि डेटा को एक थ्रेड द्वारा बदला जा सके जब कोई अन्य इसकी अपेक्षा नहीं कर रहा हो। इस समस्या के लिए सामान्य शब्द "दौड़ की स्थिति" है। दूसरे शब्दों में, दो धागे एक ही डेटा को अपडेट करने के लिए "रेस" में शामिल हो सकते हैं और यह परिणाम अलग-अलग हो सकता है कि कौन सा थ्रेड "जीतता है"। एक तुच्छ उदाहरण के रूप में, मान लीजिए कि आप एक लूप कोडिंग कर रहे हैं:
यदि लूप काउंटर "I" अप्रत्याशित रूप से संख्या 7 से छूट जाता है और 6 से 8 तक चला जाता है - लेकिन केवल कुछ ही समय में - जो कुछ भी लूप कर रहा है उस पर यह विनाशकारी प्रभाव पड़ेगा। इस तरह की समस्याओं को रोकना थ्रेड सेफ्टी कहलाता है। यदि कार्यक्रम को बाद के ऑपरेशन में एक ऑपरेशन के परिणाम की आवश्यकता होती है, तो इसे करने के लिए समानांतर प्रक्रियाओं या थ्रेड्स को कोड करना असंभव हो सकता है।
बेसिक मल्टीथ्रेडिंग ऑपरेशन
यह एहतियाती बात को पृष्ठभूमि में धकेलने और कुछ मल्टीथ्रेडिंग कोड लिखने का समय है। यह लेख अभी सादगी के लिए एक कंसोल एप्लिकेशन का उपयोग करता है। यदि आप साथ चलना चाहते हैं, तो विज़ुअल स्टूडियो को एक नए कंसोल एप्लिकेशन प्रोजेक्ट के साथ शुरू करें।
मल्टीथ्रेडिंग द्वारा प्रयुक्त प्राथमिक नामस्थान सिस्टम है। थ्रेडिंग नेमस्पेस और थ्रेड क्लास नए थ्रेड्स बनाएंगे, शुरू करेंगे और बंद करेंगे। नीचे दिए गए उदाहरण में, ध्यान दें कि TestMultiThreading एक प्रतिनिधि है। यही है, आपको एक विधि के नाम का उपयोग करना होगा जिसे थ्रेड विधि कॉल कर सकती है।
इस एप्लिकेशन में, हम बस इसे कॉल करके दूसरे सब को निष्पादित कर सकते हैं:
यह धारावाहिक फैशन में पूरे आवेदन को निष्पादित करेगा। ऊपर दिए गए पहले कोड का उदाहरण, हालांकि, टेस्टमूल्टि थ्रेडिंग सबरूटीन को बंद कर देता है और फिर जारी रहता है।
एक पुनरावर्ती एल्गोरिथम उदाहरण
एक पुनरावर्ती एल्गोरिथ्म का उपयोग करते हुए एक सरणी के क्रमपरिवर्तन की गणना करने वाला एक बहुपरत अनुप्रयोग है। यहां सभी कोड नहीं दिखाए गए हैं। वर्णों के क्रमित होने की सरणी बस "1," "2," "3," "4," और "5." है। यहाँ कोड का उचित भाग है।
ध्यान दें कि परमिट सब को कॉल करने के दो तरीके हैं (दोनों ने ऊपर दिए गए कोड में टिप्पणी की)। एक थ्रेड को बंद करता है और दूसरा इसे सीधे कॉल करता है। यदि आप इसे सीधे फोन करते हैं, तो आपको यह मिलता है:
हालाँकि, यदि आप एक थ्रेड को बंद करते हैं और इसके बजाय परमिट सब को प्रारंभ करते हैं, तो आपको मिलता है:
यह स्पष्ट रूप से दिखाता है कि कम से कम एक क्रमपरिवर्तन उत्पन्न होता है, फिर मुख्य उप आगे बढ़ता है और "समाप्त मुख्य" प्रदर्शित करता है, जबकि बाकी क्रमपरिवर्तन उत्पन्न किए जा रहे हैं। चूंकि डिस्प्ले परमिट सब द्वारा बुलाए गए दूसरे उप से आता है, आप जानते हैं कि नए धागे का भी हिस्सा है। यह इस अवधारणा को दर्शाता है कि एक धागा "निष्पादन का एक मार्ग" है जैसा कि पहले उल्लेख किया गया है।
रेस कंडीशन का उदाहरण
इस लेख के पहले भाग में एक दौड़ की स्थिति का उल्लेख किया गया था। यहाँ एक उदाहरण है जो इसे सीधे दिखाता है:
तत्काल खिड़की ने एक परीक्षण में यह परिणाम दिखाया। अन्य परीक्षण अलग थे। यह एक दौड़ की स्थिति का सार है।