2010-01-23 21 views
12

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

+2

यह बेहद सामान्य है। एक थ्रेड केवल एक कार्यकर्ता है जो कमांड निष्पादित करता है। "थ्रेड सुरक्षा" यह सुनिश्चित कर रही है कि दो या दो से अधिक धागे समस्याएं उत्पन्न न करें जब वे बातचीत करते हैं। जहां तक ​​एक गेम इंजन धागे का उपयोग करता है ... ऐसा करने के लिए लगभग दस लाख तरीके हैं। –

+3

ब्लंट होने के लिए। धागे जोड़ने के बारे में भूल जाओ। यह कहने जैसा है कि आपको प्राथमिक चिकित्सा की बुनियादी समझ है और मस्तिष्क सर्जरी करना चाहते हैं। वापस जाओ और मूल बातें सीखो। –

+0

यह सवाल किसी भी उचित तरीके से उत्तर देने के लिए बहुत व्यापक है। – Kev

उत्तर

31

यह एक बहुत ही व्यापक विषय है। लेकिन यहाँ बातें मैं जानना चाहता हूँ होगा अगर मैं धागे के बारे में कुछ भी नहीं पता था कि इस प्रकार हैं:

  • वे एक भी प्रक्रिया के भीतर निष्पादन की इकाइयों है कि "समानांतर में" हो रहे हैं - क्या इसका मतलब यह है की जाती है कि निष्पादन की वर्तमान इकाई प्रोसेसर में तेजी से स्विच करता है। यह विभिन्न माध्यमों के माध्यम से हासिल किया जा सकता है। स्विचिंग को "संदर्भ स्विचिंग" कहा जाता है, और इसके साथ कुछ ओवरहेड जुड़ा हुआ है।

  • वे स्मृति साझा कर सकते हैं! यह वह जगह है जहां समस्याएं हो सकती हैं। मैं बाद में बुलेट बिंदु में गहराई से इस बारे में बात करता हूं।

  • आपके आवेदन को समानांतर करने का लाभ यह है कि मशीन के विभिन्न हिस्सों का उपयोग करने वाले तर्क एक साथ हो सकते हैं। यही है, अगर आपकी प्रक्रिया का हिस्सा I/O-bound है और इसका हिस्सा सीपीयू-बाउंड है, तो I/O गहन ऑपरेशन को तब तक इंतजार नहीं करना पड़ेगा जब तक कि CPU-गहन ऑपरेशन नहीं किया जाता है। कुछ भाषाएं आपको एक ही समय में थ्रेड चलाने की अनुमति देती हैं यदि आपके पास मल्टीकोर प्रोसेसर है (और इस प्रकार सीपीयू-गहन परिचालनों को समानांतर करता है), हालांकि यह हमेशा ऐसा नहीं होता है।

  • थ्रेड-सुरक्षित मतलब है कि कोई दौड़ की स्थिति जो कि तब होता है जब अपनी प्रक्रिया के निष्पादन के समय (कुछ आप पर भरोसा करते हैं नहीं करना चाहती) पर निर्भर करता है की समस्याओं के लिए प्रयोग किया जाता है देखते हैं कि,। उदाहरण के लिए, धागे A और B दोनों एक साझा काउंटर C incrementing आप है, तो आप इस मामले में जहां AC का मूल्य पढ़ता देख सकते हैं, तो BC का मूल्य पढ़ता है, तो AC+1 साथ C अधिलेखित कर देता है, तो B साथ C अधिलेखित कर देता है C+1। ध्यान दें कि C केवल एक बार वास्तव में वृद्धि करता है!

  • आम तरीकों में से एक जोड़े को दौड़ की स्थिति तुल्यकालन, जो साझा राज्य के लिए आपसी पहुँच शामिल नहीं है, या बस नहीं होने के लिए किसी भी सब पर साझा राज्य शामिल करने से बचें। लेकिन यह सिर्फ हिमशैल की नोक है - थ्रेड-सुरक्षा काफी व्यापक विषय है।

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

+0

इससे मुझे बहुत मदद मिली! धन्यवाद! – Orm

+0

+1 विषय के लिए अच्छा परिचय। – Grundlefleck

+0

@ ओआरएम: बहुत स्वागत है; मुझे खुशी है कि यह सहायक था। – danben

0

एक अच्छी किताब है, प्रैक्टिस, http://www.javaconcurrencyinpractice.com/ में जावा कंसुरेंसी।

+0

हालांकि यह एक शानदार किताब है, यह जावा में समरूपता के मूल तंत्र के पूर्व ज्ञान को मानता है, जो पूछताछ शायद तैयार नहीं है। – Grundlefleck

+0

यह सही है, मैं भूल गया कि इसमें कोई परिचय शामिल नहीं है। –

1

थ्रेड अनुप्रयोगों को तेज़ी से नहीं बढ़ाते हैं। एल्गोरिदम अनुप्रयोगों को गति देता है। उपयुक्त होने पर, थ्रेड का उपयोग एल्गोरिदम में किया जा सकता है।

+2

थ्रेड * कुछ शर्तों के तहत * आपके आवेदन को तेज कर सकते हैं। जैसे कि धारावाहिक, अवरुद्ध कार्यों को समानांतर कार्यों में विभाजित किया जा सकता है। मल्टी-कोर सिस्टम पर प्रभाव बढ़ता है, जो मानक बन रहा है। एक कार्य पर विचार करें जो एक टीसीपी/आईपी अनुरोध करना चाहिए और प्रतिक्रिया के लिए प्रतीक्षा करें। यदि यह कार्य एक धागे पर अवरुद्ध करता है, तो उनमें से 10 में 10x समय लगेगा। यदि समानांतर है, तो इसे समय की मात्रा में केवल 1x से कम किया जा सकता है। – Grundlefleck

+0

... या यह सिर्फ शब्दावली का एक सुधार है? :) – Grundlefleck

+0

हाँ, मैंने एक एल्गोरिदम कक्षा में अध्ययन किया है और हमेशा एल्गोरिदम का अध्ययन कर रहा हूं, लेकिन मैं बहु-कोर प्रोसेसर मानक बनने के साथ अपने क्षितिज को और अधिक विस्तारित करना चाहता था। – Orm

1

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

जहां तक ​​धागा सुरक्षित है, इसका अर्थ यह है कि एक ऐसा फ़ंक्शन जिसमें कुछ आंतरिक सहेजे गए राज्य नहीं हैं। यदि ऐसा होता है तो आप इसे एक साथ उपयोग करके एकाधिक धागे नहीं कर पाएंगे।

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

जहां तक ​​प्रक्रिया के बीच अंतर एस और धागे (जिन्हें आपने नहीं पूछा) प्रक्रियाएं एक ओएस स्तर इकाई हैं, जबकि धागे एक कार्यक्रम से जुड़े हुए हैं। कुछ मामलों में आपका प्रोग्राम थ्रेड की बजाय प्रक्रिया बनाना चाहता है।

+2

हालांकि कुछ भी स्टेटलेस थ्रेड-सुरक्षित है, थ्रेड-सुरक्षित का मतलब स्टेटलेस नहीं है – danben

+0

क्षमा करें, मैं एक picky मूड में हूं ... "... धागे पृष्ठभूमि प्रसंस्करण होने के उद्देश्य से हैं जो उपयोगकर्ता इंटरफ़ेस को स्थिर नहीं करेगा । " - जो पढ़ता है जैसे कि यह थ्रेडिंग का एकमात्र उद्देश्य है, जो निश्चित रूप से सत्य नहीं है, हालांकि यह उपयोगों में से एक है। – Grundlefleck

1

थ्रेड एक साथ कई चीजों को निष्पादित करने का एक तरीका है (यह मानते हुए कि जिस प्लेटफॉर्म पर वे चल रहे हैं वह समानांतर निष्पादन में सक्षम है)। थ्रेड सुरक्षा बस है (ठीक है, धागे के साथ कुछ भी वास्तव में सरल नहीं है) यह सुनिश्चित कर लें कि धागे हानिकारक तरीकों से एक-दूसरे को प्रभावित न करें।

सामान्य रूप से, आप स्क्रीन पर ग्राफिक्स को प्रस्तुत करने के लिए कई धागे का उपयोग करने की संभावना नहीं देखते हैं क्योंकि कई प्रदर्शन प्रभाव और जटिलता के मुद्दों से उत्पन्न हो सकता है। राज्य प्रबंधन (या एआई) से संबंधित अन्य कार्यों को संभावित रूप से अलग धागे में स्थानांतरित किया जा सकता है।

1

थ्रेडिंग का पहला नियम: थ्रेड नहीं। थ्रेडिंग का दूसरा नियम: यदि आपको नियम एक का उल्लंघन करना है ... नहीं। तीसरा नियम: ठीक है, ठीक है आपको धागे का उपयोग करना है, इसलिए आगे बढ़ने से पहले अपने सिर को नुकसान पहुंचाएं, लॉकिंग और सामान्य थ्रेड समस्याओं जैसे डेडलॉक और लाइफॉकिंग को समझें।

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

Effective Java और Clean Code दोनों में थ्रेड अनुभाग थ्रेड और उनके नुकसान के लिए अच्छे परिचय हैं।

+4

सामान्यीकरण का पहला नियम: सामान्यीकृत न करें। – danben

+5

मल्टीथ्रेडिंग * करता है * एक गतिशील प्रदान करता है जब आपके समांतर, सीपीयू-बाध्य कार्य होते हैं और कई प्रोसेसर (या कोर) उपलब्ध होते हैं। काम को * एन * धागे में विभाजित करें और नौकरी लगभग 1/एन समय में करें, जहां * एन * प्रोसेसर की संख्या से कम या बराबर है। – Wyzard

+1

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

2

धागे के बारे में आपको चार चीजें जाननी चाहिए।

  1. थ्रेड प्रक्रियाओं की तरह हैं, लेकिन वे स्मृति साझा करते हैं।

  2. थ्रेड में अक्सर हार्डवेयर, ओएस और भाषा समर्थन होता है, जो उन्हें प्रक्रियाओं से बेहतर बना सकता है।

  3. बहुत सारी उग्र छोटी चीजें हैं जो धागे को समर्थन करने की आवश्यकता होती है (जैसे ताले और सेमफोर) ताकि उन्हें स्मृति को एक असंगत स्थिति में साझा न किया जाए। इससे उन्हें उपयोग करना थोड़ा मुश्किल हो जाता है।

  4. लॉकिंग स्वचालित नहीं है (मुझे पता है कि भाषाओं में), इसलिए आपको स्मृति (स्पष्ट रूप से) साझा करने के साथ सावधान रहना होगा।

1

के बाद से सवाल 'Java' के साथ टैग है, मुझे लगता है आप जावा के साथ परिचित हैं, जिस स्थिति में यह एक महान परिचयात्मक ट्यूटोरियल http://java.sun.com/docs/books/tutorial/essential/concurrency/

1

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

मैं अत्यधिक तुम समय लेने के लिए जावा में पुस्तक समवर्ती प्रोग्रामिंग पढ़ने के लिए सलाह देते हैं http://gee.cs.oswego.edu/dl/cpj/

Lea न केवल आप अवधारणाओं को पढ़ाने के लिए समय लगता है, लेकिन यह भी समवर्ती प्रोग्रामिंग प्राइमेटिव्स का उपयोग करने के लिए आपको सही और गलत तरीके दिखाने के लिए (जावा में लेकिन साझा-मेमोरी लॉकिंग/सिग्नलिंग शैली समरूपता का उपयोग करने वाले किसी अन्य वातावरण के लिए भी सहायक)। सबसे अधिक वह समवर्ती प्रोग्रामिंग की कठिनाई के लिए सम्मान सिखाता है।

मुझे यह जोड़ना चाहिए कि समवर्ती प्रोग्रामिंग की यह शैली सबसे आम है लेकिन एकमात्र दृष्टिकोण नहीं है। संदेश भी पास हो रहा है, जो सुरक्षित है लेकिन आपको अपने एल्गोरिदम को अलग-अलग संरचना करने के लिए मजबूर करता है।

1

के बाद से मूल पोस्ट बहुत व्यापक है, और भी सी ++ के साथ टैग है, मुझे लगता है कि निम्नलिखित संकेत प्रासंगिक हैं:

एंथनी विलियम्स, बूस्ट थ्रेड लाइब्रेरी के मेंटेनर, एक किताब बुलाया पर काम कर रहा है "सी ++ कन्करेंसी इन एक्शन ", एक विवरण जिसमें आप here पा सकते हैं। पहला (प्रारंभिक) अध्याय पीडीएफ फॉर्म here में मुफ्त में उपलब्ध है।

इसके अलावा, हर्ब सटर (अन्य चीजों के साथ, उनकी "असाधारण सी ++" श्रृंखला के लिए जाना जाता है) एक पुस्तक लिख रही है जिसे "प्रभावी कंसुरेंसी" कहा जाता है, जिनमें से कई लेख ड्राफ्ट फॉर्म here में उपलब्ध हैं।

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