मैं निष्पादन को तेज करने के लिए अपने आवेदन में थ्रेडेड प्रक्रियाओं को जोड़ने पर विचार कर रहा हूं, लेकिन समस्या यह है कि मुझे ईमानदारी से पता नहीं है कि धागे का उपयोग कैसे किया जाए, या जिसे "थ्रेड सुरक्षित" माना जाता है। उदाहरण के लिए, गेम इंजन अपनी प्रतिपादन प्रक्रियाओं में धागे का उपयोग कैसे करता है, या किन संदर्भों में थ्रेड को केवल बाधा के अलावा कुछ भी नहीं माना जाएगा? क्या कोई मुझे कुछ संसाधनों के बारे में बता सकता है ताकि मुझे और सीखने में मदद मिल सके?क्या कोई मुझे धागे समझा सकता है?
उत्तर
यह एक बहुत ही व्यापक विषय है। लेकिन यहाँ बातें मैं जानना चाहता हूँ होगा अगर मैं धागे के बारे में कुछ भी नहीं पता था कि इस प्रकार हैं:
वे एक भी प्रक्रिया के भीतर निष्पादन की इकाइयों है कि "समानांतर में" हो रहे हैं - क्या इसका मतलब यह है की जाती है कि निष्पादन की वर्तमान इकाई प्रोसेसर में तेजी से स्विच करता है। यह विभिन्न माध्यमों के माध्यम से हासिल किया जा सकता है। स्विचिंग को "संदर्भ स्विचिंग" कहा जाता है, और इसके साथ कुछ ओवरहेड जुड़ा हुआ है।
वे स्मृति साझा कर सकते हैं! यह वह जगह है जहां समस्याएं हो सकती हैं। मैं बाद में बुलेट बिंदु में गहराई से इस बारे में बात करता हूं।
आपके आवेदन को समानांतर करने का लाभ यह है कि मशीन के विभिन्न हिस्सों का उपयोग करने वाले तर्क एक साथ हो सकते हैं। यही है, अगर आपकी प्रक्रिया का हिस्सा I/O-bound है और इसका हिस्सा सीपीयू-बाउंड है, तो I/O गहन ऑपरेशन को तब तक इंतजार नहीं करना पड़ेगा जब तक कि CPU-गहन ऑपरेशन नहीं किया जाता है। कुछ भाषाएं आपको एक ही समय में थ्रेड चलाने की अनुमति देती हैं यदि आपके पास मल्टीकोर प्रोसेसर है (और इस प्रकार सीपीयू-गहन परिचालनों को समानांतर करता है), हालांकि यह हमेशा ऐसा नहीं होता है।
थ्रेड-सुरक्षित मतलब है कि कोई दौड़ की स्थिति जो कि तब होता है जब अपनी प्रक्रिया के निष्पादन के समय (कुछ आप पर भरोसा करते हैं नहीं करना चाहती) पर निर्भर करता है की समस्याओं के लिए प्रयोग किया जाता है देखते हैं कि,। उदाहरण के लिए, धागे
A
औरB
दोनों एक साझा काउंटरC
incrementing आप है, तो आप इस मामले में जहांA
C
का मूल्य पढ़ता देख सकते हैं, तोB
C
का मूल्य पढ़ता है, तोA
C+1
साथC
अधिलेखित कर देता है, तोB
साथC
अधिलेखित कर देता हैC+1
। ध्यान दें किC
केवल एक बार वास्तव में वृद्धि करता है!आम तरीकों में से एक जोड़े को दौड़ की स्थिति तुल्यकालन, जो साझा राज्य के लिए आपसी पहुँच शामिल नहीं है, या बस नहीं होने के लिए किसी भी सब पर साझा राज्य शामिल करने से बचें। लेकिन यह सिर्फ हिमशैल की नोक है - थ्रेड-सुरक्षा काफी व्यापक विषय है।
मुझे उम्मीद है कि इससे मदद मिलती है! समझें कि यह उस चीज़ के लिए एक बहुत ही त्वरित परिचय था जिसके लिए सीखने की अच्छी आवश्यकता होती है। मैं आपकी पसंदीदा भाषा में मल्टीथ्रेडिंग के बारे में संसाधन ढूंढने की सिफारिश करता हूं, जो कुछ भी होता है, और इसे पूरी तरह पढ़ा जाता है।
इससे मुझे बहुत मदद मिली! धन्यवाद! – Orm
+1 विषय के लिए अच्छा परिचय। – Grundlefleck
@ ओआरएम: बहुत स्वागत है; मुझे खुशी है कि यह सहायक था। – danben
एक अच्छी किताब है, प्रैक्टिस, http://www.javaconcurrencyinpractice.com/ में जावा कंसुरेंसी।
हालांकि यह एक शानदार किताब है, यह जावा में समरूपता के मूल तंत्र के पूर्व ज्ञान को मानता है, जो पूछताछ शायद तैयार नहीं है। – Grundlefleck
यह सही है, मैं भूल गया कि इसमें कोई परिचय शामिल नहीं है। –
थ्रेड अनुप्रयोगों को तेज़ी से नहीं बढ़ाते हैं। एल्गोरिदम अनुप्रयोगों को गति देता है। उपयुक्त होने पर, थ्रेड का उपयोग एल्गोरिदम में किया जा सकता है।
थ्रेड * कुछ शर्तों के तहत * आपके आवेदन को तेज कर सकते हैं। जैसे कि धारावाहिक, अवरुद्ध कार्यों को समानांतर कार्यों में विभाजित किया जा सकता है। मल्टी-कोर सिस्टम पर प्रभाव बढ़ता है, जो मानक बन रहा है। एक कार्य पर विचार करें जो एक टीसीपी/आईपी अनुरोध करना चाहिए और प्रतिक्रिया के लिए प्रतीक्षा करें। यदि यह कार्य एक धागे पर अवरुद्ध करता है, तो उनमें से 10 में 10x समय लगेगा। यदि समानांतर है, तो इसे समय की मात्रा में केवल 1x से कम किया जा सकता है। – Grundlefleck
... या यह सिर्फ शब्दावली का एक सुधार है? :) – Grundlefleck
हाँ, मैंने एक एल्गोरिदम कक्षा में अध्ययन किया है और हमेशा एल्गोरिदम का अध्ययन कर रहा हूं, लेकिन मैं बहु-कोर प्रोसेसर मानक बनने के साथ अपने क्षितिज को और अधिक विस्तारित करना चाहता था। – Orm
वैसे कोई शायद इस बेहतर जवाब देगा, लेकिन धागे पृष्ठभूमि प्रक्रिया होने के उद्देश्य से हैं जो उपयोगकर्ता इंटरफ़ेस को स्थिर नहीं करेगा।आप कुंजीपटल इनपुट या माउस इनपुट स्वीकार करना बंद नहीं करना चाहते हैं, और उपयोगकर्ता को बताएं, "बस एक पल, मैं इस गणना को खत्म करना चाहता हूं, यह केवल कुछ और सेकंड होगा।" (और फिर भी यह आश्चर्यजनक है कि वाणिज्यिक कार्यक्रम कितनी बार करते हैं।
जहां तक धागा सुरक्षित है, इसका अर्थ यह है कि एक ऐसा फ़ंक्शन जिसमें कुछ आंतरिक सहेजे गए राज्य नहीं हैं। यदि ऐसा होता है तो आप इसे एक साथ उपयोग करके एकाधिक धागे नहीं कर पाएंगे।
जहां तक थ्रेड प्रोग्रामिंग आपको बस इसे करना शुरू करना है, और फिर आप थ्रेड प्रोग्रामिंग के लिए अद्वितीय विभिन्न मुद्दों का सामना करना शुरू कर देंगे, उदाहरण के लिए डेटा के साथ-साथ पहुंच, इस मामले में आपको कुछ सिंक्रनाइज़ेशन विधि का उपयोग करने का निर्णय लेना होगा जैसे महत्वपूर्ण वर्ग या म्यूटेक्स या कुछ और, प्रत्येक व्यक्ति के व्यवहार में थोड़ा अलग बारीकियां होती हैं।
जहां तक प्रक्रिया के बीच अंतर एस और धागे (जिन्हें आपने नहीं पूछा) प्रक्रियाएं एक ओएस स्तर इकाई हैं, जबकि धागे एक कार्यक्रम से जुड़े हुए हैं। कुछ मामलों में आपका प्रोग्राम थ्रेड की बजाय प्रक्रिया बनाना चाहता है।
हालांकि कुछ भी स्टेटलेस थ्रेड-सुरक्षित है, थ्रेड-सुरक्षित का मतलब स्टेटलेस नहीं है – danben
क्षमा करें, मैं एक picky मूड में हूं ... "... धागे पृष्ठभूमि प्रसंस्करण होने के उद्देश्य से हैं जो उपयोगकर्ता इंटरफ़ेस को स्थिर नहीं करेगा । " - जो पढ़ता है जैसे कि यह थ्रेडिंग का एकमात्र उद्देश्य है, जो निश्चित रूप से सत्य नहीं है, हालांकि यह उपयोगों में से एक है। – Grundlefleck
थ्रेड एक साथ कई चीजों को निष्पादित करने का एक तरीका है (यह मानते हुए कि जिस प्लेटफॉर्म पर वे चल रहे हैं वह समानांतर निष्पादन में सक्षम है)। थ्रेड सुरक्षा बस है (ठीक है, धागे के साथ कुछ भी वास्तव में सरल नहीं है) यह सुनिश्चित कर लें कि धागे हानिकारक तरीकों से एक-दूसरे को प्रभावित न करें।
सामान्य रूप से, आप स्क्रीन पर ग्राफिक्स को प्रस्तुत करने के लिए कई धागे का उपयोग करने की संभावना नहीं देखते हैं क्योंकि कई प्रदर्शन प्रभाव और जटिलता के मुद्दों से उत्पन्न हो सकता है। राज्य प्रबंधन (या एआई) से संबंधित अन्य कार्यों को संभावित रूप से अलग धागे में स्थानांतरित किया जा सकता है।
थ्रेडिंग का पहला नियम: थ्रेड नहीं। थ्रेडिंग का दूसरा नियम: यदि आपको नियम एक का उल्लंघन करना है ... नहीं। तीसरा नियम: ठीक है, ठीक है आपको धागे का उपयोग करना है, इसलिए आगे बढ़ने से पहले अपने सिर को नुकसान पहुंचाएं, लॉकिंग और सामान्य थ्रेड समस्याओं जैसे डेडलॉक और लाइफॉकिंग को समझें।
समझें कि थ्रेडिंग कुछ भी तेज नहीं करता है, यह केवल लंबे समय तक चलने वाली प्रक्रियाओं के लिए उपयोगी है जिससे उपयोगकर्ता एप्लिकेशन के साथ कुछ और कर सकता है। यदि आपको एप्लिकेशन में एप्लिकेशन के साथ बातचीत करने की अनुमति देनी है, जबकि ऐप पृष्ठभूमि में कुछ और करता है, जैसे कि सॉकेट को मतदान करें या एप्लिकेशन में कहीं और से एसिंक्रोनस इनपुट की प्रतीक्षा करें, तो आपको वास्तव में थ्रेडिंग की आवश्यकता हो सकती है।
Effective Java और Clean Code दोनों में थ्रेड अनुभाग थ्रेड और उनके नुकसान के लिए अच्छे परिचय हैं।
सामान्यीकरण का पहला नियम: सामान्यीकृत न करें। – danben
मल्टीथ्रेडिंग * करता है * एक गतिशील प्रदान करता है जब आपके समांतर, सीपीयू-बाध्य कार्य होते हैं और कई प्रोसेसर (या कोर) उपलब्ध होते हैं। काम को * एन * धागे में विभाजित करें और नौकरी लगभग 1/एन समय में करें, जहां * एन * प्रोसेसर की संख्या से कम या बराबर है। – Wyzard
यह सच है, और इन दिनों अधिक से अधिक बहु-कोर प्रोसेसर के साथ अधिक लागू है। मुद्दा लेना। लेकिन बहु-प्रोसेसर वातावरण में भी ऑप्टिमाइज़ेशन के लिए थ्रेड का उपयोग करना एक पागल प्रस्ताव है, केवल तभी सलाह दी जाती है जब आपका आर्किटेक्चर * जरूरी * एसिंक्रोनस हो, उदाहरण के लिए जब किसी प्रकार का सर्वर लिखना जो कई श्रमिकों को स्पिन करेगा, आदि –
धागे के बारे में आपको चार चीजें जाननी चाहिए।
थ्रेड प्रक्रियाओं की तरह हैं, लेकिन वे स्मृति साझा करते हैं।
थ्रेड में अक्सर हार्डवेयर, ओएस और भाषा समर्थन होता है, जो उन्हें प्रक्रियाओं से बेहतर बना सकता है।
बहुत सारी उग्र छोटी चीजें हैं जो धागे को समर्थन करने की आवश्यकता होती है (जैसे ताले और सेमफोर) ताकि उन्हें स्मृति को एक असंगत स्थिति में साझा न किया जाए। इससे उन्हें उपयोग करना थोड़ा मुश्किल हो जाता है।
लॉकिंग स्वचालित नहीं है (मुझे पता है कि भाषाओं में), इसलिए आपको स्मृति (स्पष्ट रूप से) साझा करने के साथ सावधान रहना होगा।
के बाद से सवाल 'Java' के साथ टैग है, मुझे लगता है आप जावा के साथ परिचित हैं, जिस स्थिति में यह एक महान परिचयात्मक ट्यूटोरियल http://java.sun.com/docs/books/tutorial/essential/concurrency/
Orm, महान सवाल पूछने के लिए है। मुझे लगता है कि सभी गंभीर प्रोग्रामर को धागे के बारे में सीखना चाहिए, अंत में आप कम से कम उनका उपयोग करने पर विचार करेंगे और जब आप ऐसा करेंगे तो आप वास्तव में तैयार रहना चाहते हैं। Concurrency कीड़े अविश्वसनीय रूप से सूक्ष्म हो सकती है और उनसे बचने का सबसे अच्छा तरीका यह जानना है कि कौन से मुहावरे सुरक्षित हैं (-श)। डिजाइन सिद्धांत और पैटर्न डौग ली द्वारा:
मैं अत्यधिक तुम समय लेने के लिए जावा में पुस्तक समवर्ती प्रोग्रामिंग पढ़ने के लिए सलाह देते हैं http://gee.cs.oswego.edu/dl/cpj/
Lea न केवल आप अवधारणाओं को पढ़ाने के लिए समय लगता है, लेकिन यह भी समवर्ती प्रोग्रामिंग प्राइमेटिव्स का उपयोग करने के लिए आपको सही और गलत तरीके दिखाने के लिए (जावा में लेकिन साझा-मेमोरी लॉकिंग/सिग्नलिंग शैली समरूपता का उपयोग करने वाले किसी अन्य वातावरण के लिए भी सहायक)। सबसे अधिक वह समवर्ती प्रोग्रामिंग की कठिनाई के लिए सम्मान सिखाता है।
मुझे यह जोड़ना चाहिए कि समवर्ती प्रोग्रामिंग की यह शैली सबसे आम है लेकिन एकमात्र दृष्टिकोण नहीं है। संदेश भी पास हो रहा है, जो सुरक्षित है लेकिन आपको अपने एल्गोरिदम को अलग-अलग संरचना करने के लिए मजबूर करता है।
के बाद से मूल पोस्ट बहुत व्यापक है, और भी सी ++ के साथ टैग है, मुझे लगता है कि निम्नलिखित संकेत प्रासंगिक हैं:
एंथनी विलियम्स, बूस्ट थ्रेड लाइब्रेरी के मेंटेनर, एक किताब बुलाया पर काम कर रहा है "सी ++ कन्करेंसी इन एक्शन ", एक विवरण जिसमें आप here पा सकते हैं। पहला (प्रारंभिक) अध्याय पीडीएफ फॉर्म here में मुफ्त में उपलब्ध है।
इसके अलावा, हर्ब सटर (अन्य चीजों के साथ, उनकी "असाधारण सी ++" श्रृंखला के लिए जाना जाता है) एक पुस्तक लिख रही है जिसे "प्रभावी कंसुरेंसी" कहा जाता है, जिनमें से कई लेख ड्राफ्ट फॉर्म here में उपलब्ध हैं।
- 1. क्या कोई मुझे पॉलिमॉर्फिज्म समझा सकता है?
- 2. क्या कोई मुझे इस सेमेक स्क्रिप्ट को समझा सकता है?
- 3. क्या कोई मुझे एएसपीनेट रूटिंग सिंटैक्स समझा सकता है?
- 4. क्या कोई मुझे सी ++ अपवाद विनिर्देशों को समझा सकता है?
- 5. क्या कोई मुझे हेक्स ऑफ़सेट समझा सकता है?
- 6. क्या कोई मुझे बैकप्रोपैगेशन एल्गोरिदम समझा सकता है?
- 7. क्या कोई मुझे घूर्णन कैलिपर समझा सकता है?
- 8. क्या कोई मुझे एआरएम bitwise संचालन समझा सकता है?
- 9. क्या कोई मुझे एएसपी.नेट एमवीसी समझा सकता है?
- 10. क्या कोई मुझे इस SQL क्वेरी को समझा सकता है?
- 11. क्या कोई मुझे हाइबरनेट में @MapsId समझा सकता है?
- 12. क्या कोई मुझे PHP में पैक() फ़ंक्शन समझा सकता है?
- 13. क्या कोई मुझे इस कोड को समझा सकता है?
- 14. क्या कोई मुझे एएसपी.NET ट्रस्ट स्तर समझा सकता है?
- 15. क्या कोई मुझे स्कैला में अंतर्निहित रूपांतरण समझा सकता है?
- 16. क्या कोई मुझे रूबी में NaN समझा सकता है?
- 17. क्या कोई ओथ को समझा सकता है?
- 18. क्या कोई एलडीएपी समझा सकता है?
- 19. क्या कोई एटीआर समझा सकता है?
- 20. क्या कोई मुझे इस लैम्ब्डा अभिव्यक्ति को समझा सकता है? यह मुझे पागल हो रहा है
- 21. कोई भी सर्वलेट मैपिंग समझा सकता है?
- 22. क्या कोई माइक्रोसॉफ्ट यूनिटी को समझा सकता है?
- 23. क्या कोई कोहाना 3 की रूटिंग सिस्टम समझा सकता है?
- 24. क्या कोई इस वाक्यविन्यास को समझा सकता है?
- 25. क्या कोई डीबीसीसी ड्रॉप्लेनबफर को समझा सकता है?
- 26. क्या कोई अलग पर्ल कैश कार्यान्वयन समझा सकता है?
- 27. क्या कोई इस जावा कोड को समझा सकता है
- 28. क्या कोई ड्रूपल में "पहुंच तर्क" समझा सकता है?
- 29. क्या कोई __declspec (नग्न) कृपया समझा सकता है?
- 30. क्या कोई इस सी ++ टाइपपीफ को समझा सकता है?
यह बेहद सामान्य है। एक थ्रेड केवल एक कार्यकर्ता है जो कमांड निष्पादित करता है। "थ्रेड सुरक्षा" यह सुनिश्चित कर रही है कि दो या दो से अधिक धागे समस्याएं उत्पन्न न करें जब वे बातचीत करते हैं। जहां तक एक गेम इंजन धागे का उपयोग करता है ... ऐसा करने के लिए लगभग दस लाख तरीके हैं। –
ब्लंट होने के लिए। धागे जोड़ने के बारे में भूल जाओ। यह कहने जैसा है कि आपको प्राथमिक चिकित्सा की बुनियादी समझ है और मस्तिष्क सर्जरी करना चाहते हैं। वापस जाओ और मूल बातें सीखो। –
यह सवाल किसी भी उचित तरीके से उत्तर देने के लिए बहुत व्यापक है। – Kev