क्या कोई मुझे थ्रेडिंग को समझने में मदद करने के लिए मुझे लिखने के लिए एक परियोजना का सुझाव दे सकता है


13

मैं वर्तमान में सी # डेवलपर हूं जो थ्रेडिंग की एक बहुत ही अस्थिर समझ है।

इन दोनों लिंक को अन्य पोस्ट में सुझाया गया है:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

क्या मुझे मूल बातों पर वापस जाना चाहिए और शायद इस विषय पर कुछ कंप्यूटर विज्ञान ग्रंथों को देखना चाहिए?

मुझे वास्तव में लगता है कि अगर मैं सी # लाइब्रेरी में कूदता हूं और उपयोग करता हूं तो मेरे पास वास्तव में ज्ञान का एक ठोस आधार नहीं होगा। मुझे लगता है कि मुझे इस विषय को कॉम साइंस छात्र की तरह खरोंच से सीखने की जरूरत है, फिर सी # लाइब्रेरी का उपयोग करें।

क्या कोई थ्रेडिंग सीखने के दृष्टिकोण का सुझाव दे सकता है, शायद कुछ लिंक और या प्रोजेक्ट आइडिया?

अग्रिम में धन्यवाद!

संपादित करें, सभी उत्तरों के लिए धन्यवाद। कुछ लोगों ने उल्लेख किया है कि एक पुस्तक एक अच्छा विचार हो सकता है, क्या कोई सुझाव दे सकता है? मैं कुछ भाषा अज्ञेय को पसंद करूंगा। क्या किसी को पता है कि कंप्यूटर साइंस की डिग्री में इस सामान को किस वर्ग में शामिल किया जाएगा? मैं कुछ मुफ्त ऑनलाइन नोट्स और असाइनमेंट के लिए Google पर कोशिश कर रहा हूं।


मुझे नहीं पता कि यह मदद करता है लेकिन यह एक सरल ट्यूटोरियल है जो मैंने थोड़ी देर पहले VB.Net में लिखा था जो थ्रेडिंग की मूल अवधारणा को बताता है। आपको इसे आसानी से C # सुंदर में बदलने में सक्षम होना चाहिए। chrishaas.wordpress.com/2009/06/25/…
क्रिस हास

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

जवाबों:


3

एक बहु-थ्रेडेड वेब सर्वर लिखें। आप एक TON सीखेंगे । और सिर्फ थ्रेडिंग के बारे में नहीं।


4

निर्माता-उपभोक्ता समस्या एक क्लासिक उदाहरण है, और यह न केवल थ्रेडिंग को समझने में आपकी मदद करता है, बल्कि प्रोसेसर शेड्यूलिंग (यह थ्रेड्स के विपरीत बाल प्रक्रियाओं के लिए कांटा) का उपयोग करके प्रदर्शित किया जा सकता है और आपके प्रोग्राम्स ऑपरेटिंग सिस्टम के पीछे कैसे इंटरैक्ट करते हैं दृश - य।

यहाँ आपको थ्रेडिंग / फोर्किंग के बारे में महत्वपूर्ण बातें समझनी चाहिए। 1. ऑपरेटिंग सिस्टम शेड्यूल कैसे काम करता है (उदाहरण के लिए राउंड रॉबिन अल्गोरिदम) 2. रिसोर्स लॉकिंग (यदि कई थ्रेड एक ही संसाधन का उपयोग कर रहे हैं, तो आप उन्हें नहीं चाहते एक ही समय में उन तक पहुंचना - BAD THINGS HAPPEN)

यहाँ इस क्लासिक समस्या पर एक विकी लेख है: http://en.wikipedia.org/wiki/Producer-consumer-proprom

मूल रूप से, एक "निर्माता" बनाएं जो "उपभोक्ताओं" के धागे पैदा करता है। निर्माता एक "संसाधन" पैदा करता है, और उपभोक्ता इसका उपभोग करते हैं। इसे एक लूप में रखें और देखें कि क्या होता है (आपको आश्चर्य होगा कि अंततः उपभोक्ता अधिक संसाधनों का उपभोग करेंगे और फिर असंबद्ध तरीकों के कारण उपलब्ध हैं)।


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

2

क्लासिक उच्च समानांतर समस्याओं में से एक चुनें। आपको सुपर-लीनियर स्पीडअप के साथ एक लेने के लिए और अधिक दिलचस्प लग सकता है।

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


0

मुझे नहीं लगता कि एक पाठ्यपुस्तक अगला सबसे अच्छा कदम है। एक परियोजना जाने का रास्ता है। यह कुछ ऐसा होना चाहिए जिसके बारे में आप उत्साहित हों।

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

तो, स्क्रैप करने और हैकिंग शुरू करने के लिए कुछ जानकारी का पता लगाएं। यह आपको कुछ पाने के लिए लंबा नहीं होना चाहिए, यह एक सौम्य परिचय होगा।


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

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

0

निःशुल्क एक सरल जासूस बनाम जासूस app मॉडल।

प्रत्येक जासूस एक अलग धागे पर चलता है।

प्रत्येक जासूस दूसरे जासूस पर नुकसान पहुंचा सकता है, लेकिन सीधे तौर पर नहीं।

प्रत्येक जासूस दूसरे जासूस से मूल्यवान संसाधन चुरा सकता है, लेकिन सीधे नहीं।

दोनों जासूसों के पास अपने निपटान में संसाधनों का एक सीमित पूल है, और उन्हें साझा करना होगा। एक समय में केवल एक जासूस किसी दिए गए संसाधन का उपयोग कर सकता है।


0

मेरे सिर के ऊपर से: ब्रूस एकेल की पुस्तक "थिंकिंग इन जावा" के चौथे संस्करण में थ्रेडिंग पर एक बहुत लंबा अध्याय है (> 100 पृष्ठ - अपने आप में लगभग एक छोटी पुस्तक)। मैंने पुस्तक के पुराने संस्करण पढ़े हैं, और इसलिए मैंने इस अध्याय को नहीं पढ़ा है; लेकिन मुझे उनकी एक ब्लॉग पोस्ट (या उनकी पुस्तक के रिलीज़ नोट्स) याद हैं, जहाँ उनका दावा है कि यह लिखना बहुत कठिन था और अंत में यह उनके लिए एक वास्तविक उपलब्धि थी। इसकी जांच - पड़ताल करें...

इसके अलावा, इस व्यावसायिक प्रशिक्षण साइट पर यह 2.5 घंटे का वीडियो कोर्स है, लेकिन आप नि: शुल्क परीक्षण प्राप्त कर सकते हैं (क्रेडिट कार्ड डेटा होना चाहिए; इसलिए सदस्यता समाप्त करना न भूलें)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

क्या मुझे मूल बातों पर वापस जाना चाहिए और शायद इस विषय पर कुछ कंप्यूटर विज्ञान ग्रंथों को देखना चाहिए?

यह हमेशा एक अच्छा विकल्प होता है और मैं सलाह दूंगा कि आप थ्रेडिंग से परिचित होने के लिए एक अच्छी थ्रेडिंग बुक चुनें। मैंने जावा में मल्टीथ्रेडिंग सीखा और ज्ञान का अनुवाद आसानी से C # में किया।

यदि आप एक व्यावहारिक उदाहरण चाहते हैं, तो मैं आपको खाने के दार्शनिक समस्या की कोशिश करने की सलाह दूंगा

जब आप मल्टीथ्रेडिंग में हो रहे हैं तो आपको कई चीजें सीखने की जरूरत है:

  1. सिंक्रनाइज़ करने के विभिन्न तरीके (सेमाफोर, म्यूटेक्स, आदि)
  2. परमाणु संचालन (सी # में यह उन ऑपरेशनों के लिए इंटरलॉक किया गया है जो डिफ़ॉल्ट रूप से परमाणु नहीं हैं)।
  3. ताला-मुक्त समवर्ती प्रोग्रामिंग।
  4. प्रतीक्षा-मुक्त समवर्ती प्रोग्रामिंग।
  5. थ्रेड्स, थ्रेडपूल, बैकग्राउंडवॉकर्स, आदि।

मैं इस समय अन्य चीजों के बारे में नहीं सोच सकता। अलबहारी ट्यूटोरियल वास्तव में अच्छा लग रहा है!


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

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

@ लरिक: ज़रूर, डाइनिंग दार्शनिकों की समस्या को समझें। लेकिन मैं इसे लागू नहीं करेगा। गलत कोड लिखना एक कठिन आदत बन सकती है।
बेन वोइगट

@Ben Voigt, क्षमा करें, मुझे कुछ याद आ रहा है: डाइनिंग दार्शनिकों की समस्या का मुद्दा एक प्रोग्राम लिखना है जो गतिरोध नहीं करता है , इसलिए DPP को हल करने के लिए "गलत कोड" के लेखन की आवश्यकता कैसे होगी?
किरिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.