2011-06-12 18 views
15

मुझे पता है कि यह प्रश्न डुप्लिकेट के रूप में प्रतीत होता है, लेकिन मुझे अन्य प्रश्नों को पढ़ने का जवाब नहीं मिला है।सी ++ मल्टीथ्रेड सुरक्षित स्थानीय चर?

मेरी स्थिति - एक्सप्रेस संस्करण स्टूडियो + विंडोज एसडीके से विजुअल सी ++ कंपाइलर 2005।

बस एक सवाल है कि जैसे एक समारोह है, तो:

void myFunc() 
{ 
    int i=0; 
    i++; 
} 

सुरक्षित है एक से अधिक थ्रेड से कॉल करने के लिए?

हां, ऐसा लगता है जैसे यह है, लेकिन संकलक नहीं होगा I वैरिएबल मेमोरी में स्थिर हो? तो क्या उन दो धागे एक स्मृति क्षेत्र पर एक साथ काम कर रहे हैं? या मेरे डर सिर्फ मूर्ख के कुछ डर हैं? और फ़ंक्शन को कॉल करने के पल में सभी स्थानीय चर बनाए जाते हैं?

उत्तर

23

हां, यह धागा सुरक्षित है।

i स्मृति में स्थिर नहीं होगा, क्योंकि यह स्थिर नहीं है। अगर, दूसरे हाथ पर, आप लिखा था:

void myFunc() 
{ 
    static int i = 0; 
    i++; 
} 

तो यह सुरक्षित नहीं थ्रेड किया जाएगा (अच्छी तरह से, अगर i वास्तव में इस्तेमाल किया गया था)।

स्थानीय चर सभी स्टैक पर स्थित हैं (या पूरी तरह से रजिस्टरों में रहते हैं)। प्रत्येक धागे का अपना ढेर होता है, और रजिस्ट्रारों को इस तरह से संभाला जाता है कि वे अनिवार्य रूप से प्रत्येक धागे के लिए स्थानीय होते हैं (Context Switching देखें), तो आप ठीक हैं।

+0

धन्यवाद, पीटर अलेक्जेंडर! – Evengard

5

कंपाइलर आपके चर स्थिर नहीं कर सकता है, क्योंकि यह प्रोग्राम के अर्थशास्त्र को बदलता है। जब तक आप केवल अपने स्टैक पर घोषित चर के साथ चिपके रहते हैं, तो आप थ्रेड-सुरक्षा की गारंटी दे सकते हैं।

1

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

7

और समारोह को कॉल करने के पल में सभी स्थानीय चर बनाए जाते हैं?

स्थानीय चर के सामान्य कार्यान्वयन उन्हें ढेर पर बनाना है, और प्रत्येक धागे का अपना ढेर होता है, इसलिए स्थानीय ठीक होते हैं।

केवल एक बार जब आप देखना चाहते हैं तो चर एक जटिल प्रकार है, क्योंकि इसमें स्थिर डेटा या वैश्विक डेटा पर चलने वाले तर्क हो सकते हैं। सबसे अच्छा सॉफ्टवेयर निश्चित रूप से कक्षाओं को लिखने से बच जाएगा।

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