2015-11-14 6 views
5

मैं अपने स्रोत कोड में सी ++ और विंडोजएच का उपयोग कर रहा हूं। मैंने MSDN में CreateThread API पढ़ा है, लेकिन मुझे अभी भी स्टैक आकार निर्दिष्ट करने के सार को समझ में नहीं आता है। डिफ़ॉल्ट रूप से यह 1 एमबी है। लेकिन अगर मैं 32 बाइट निर्दिष्ट करता हूं तो क्या होगा?सी ++ में परिभाषित थ्रेड में स्टैक आकार क्या करता है?

धागे में ढेर आकार क्या परिभाषित करता है?

कृपया एक संपूर्ण स्पष्टीकरण प्रदान करें और मैं इसकी सराहना करूंगा। धन्यवाद।

+3

आपके द्वारा लिंक किए गए पृष्ठ में यह है: * अधिक जानकारी के लिए, [थ्रेड स्टैक आकार] देखें (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686774 (v = vs.85) .aspx) *। कृपया जिस दस्तावेज से आप लिंक करते हैं उसे पढ़ें। – bolov

+0

शायद 32 बाइट्स स्टैक के लिए पूछना भी संभव नहीं है, न्यूनतम आकार एक मेमोरी पेज होना चाहिए (आमतौर पर 4 केबी)। –

+1

आपके प्रश्न से संबंधित नहीं है, लेकिन सी ++ का उपयोग करते समय, आपको [Createbehread] (https: // msdn) के बजाय [_beginthreadex] (https://msdn.microsoft.com/en-us/library/kdzttdcb.aspx) पर कॉल करना चाहिए। microsoft.com/en-us/library/windows/desktop/ms682453.aspx)। यह दस्तावेज़ीकरण में स्पष्ट रूप से वर्तनी है। – IInspectable

उत्तर

14

स्टैक का उपयोग स्थानीय चर स्टोर करने, फ़ंक्शन कॉल में पैरामीटर पास करने, स्टोर रिटर्न पते को स्टोर करने के लिए किया जाता है। थ्रेड के ढेर में एक निश्चित आकार होता है जो थ्रेड बनने पर निर्धारित होता है। यही वह मूल्य है जिसका आप उल्लेख कर रहे हैं।

स्टैक आकार निर्धारित होता है जब धागा बनाया जाता है क्योंकि इसे संगत पता स्थान पर कब्जा करने की आवश्यकता होती है। इसका मतलब है कि धागे के ढेर के लिए संपूर्ण पता स्थान धागे बनाने के बिंदु पर आरक्षित होना चाहिए।

यदि ढेर बहुत छोटा है तो यह अतिप्रवाह हो सकता है। यह एक त्रुटि स्थिति है जिसे स्टैक ओवरफ़्लो के नाम से जाना जाता है, जिससे इस वेबसाइट ने इसका नाम लिया। जब आप कोई फ़ंक्शन कॉल करते हैं तो निम्न में से कुछ या सभी होते हैं:

  • पैरामीटर स्टैक पर धकेल दिए जाते हैं।
  • वापसी पता स्टैक पर धकेल दिया जाता है।
  • फ़ंक्शन के स्थानीय चर के लिए स्थान युक्त एक स्टैक फ्रेम बनाया गया है।

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

स्टैक आकार को बहुत कम सेट करने का नतीजा यह है कि आप ढेर को खत्म कर सकते हैं और इसे ओवरफ्लो कर सकते हैं। यह एक टर्मिनल शर्त है जिससे आप ठीक नहीं हो सकते हैं। निश्चित रूप से 32 बाइट्स (एक पृष्ठ तक गोलाकार जो 4096 बाइट्स है) लगभग सभी धागे के लिए बहुत छोटा है।

यदि आपके पास बहुत सारे धागे वाले प्रोग्राम हैं, और आप जानते हैं कि थ्रेड को 1 एमबी स्टैक आकार आरक्षित करने की आवश्यकता नहीं है तो छोटे स्टैक आकार का उपयोग करने के लिए लाभ हो सकते हैं। ऐसा करने से उपलब्ध प्रक्रिया पता स्थान को समाप्त करने से बच सकते हैं।

दूसरी तरफ आपके पास एक ऐसे थ्रेड के साथ एक प्रोग्राम हो सकता है जिसमें गहरे कॉल स्टैक हैं जो बड़ी मात्रा में स्टैक स्पेस का उपभोग करते हैं। इस परिदृश्य में आप डिफ़ॉल्ट 1 एमबी से अधिक आरक्षित हो सकते हैं।

हालांकि, जब तक आपके पास अन्यथा करने का कोई मजबूत कारण न हो, तो संभवतः डिफ़ॉल्ट स्टैक आकार से चिपकने की संभावना है।

+0

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

+1

@Matteo धन्यवाद, –

+0

किया गया, मुझे लगता है कि यह एक ठीक जवाब है। दूसरा अनुच्छेद ठीक दिखता है। अतिरिक्त जानकारी जो भविष्य में कार्यान्वयन के लिए जरूरी नहीं है, शायद स्पष्टीकरण से अधिक भ्रमित हो जाएगी। –

0

लेकिन अगर मैं 32 बाइट निर्दिष्ट करता हूं तो क्या होगा?

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

धागे में ढेर आकार क्या परिभाषित करता है?

यह परिभाषित करता है कि उस धागे के ढेर द्वारा उपयोग के लिए कितनी मेमोरी आवंटित की जाएगी।

वास्तव में क्या एक धागा कॉल स्टैक here

+0

किसने मुझे कभी चिह्नित किया है, कृपया एक अच्छा कारण देने के लिए बहुत दयालु रहें। यह समझने के लिए कि आकार क्या संदर्भित करता है, सबसे पहले यह जानने की जरूरत है कि स्टैक क्या है। इससे यह स्पष्ट हो जाता है कि आकार क्या संदर्भित करता है, नहीं? एक ढेर क्या है यह बेहतर स्पष्टीकरण है कि वह? –

1

ढेर आकार सिर्फ कई धागे बनाने के लिए और उनमें से एक में stack overflow की संभावना क्षमता के बीच तालमेल है का अच्छा वर्णन है।

अधिक ढेर आकार है, आप कम से कम धागे बना सकते हैं और स्टैक ओवरफ़्लो की कम संभावना है। आपको केवल स्टैक आकार के बारे में चिंता करनी चाहिए यदि आप कई धागे बनाने जा रहे हैं (आपको स्टैक आकार कम करना होगा लेकिन स्टैक ओवरफ़्लो के बारे में याद रखना होगा)। अन्यथा डिफ़ॉल्ट मान पर्याप्त है।

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