2010-12-22 13 views
10

सी ++ में, जब आपके पास स्थिर सदस्य फ़ंक्शन में स्थानीय चर होते हैं, तो क्या इसका मतलब यह है कि वे स्थानीय चर भी अंतर्निहित स्थिर हैं या क्या वे वास्तव में स्थानीय हैं?स्थैतिक सदस्य फ़ंक्शन और थ्रेड-सुरक्षा

उदाहरण:

static void myClass::somefunc(int someint) 
{ 

int myint = someint; // is myint really a local variable or does it change due to the static qualifier at function level? 


} 

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

संपादित करें: उत्तर के लिए Thanx। अब क्या होगा यदि मैं boost::shared_ptr<T> में पास हुआ, यह जानकर कि यह ऑब्जेक्ट किसी अन्य थ्रेड द्वारा समवर्ती रूप से उपयोग नहीं किया जा रहा है? (सुनिश्चित नहीं है कि कोई वास्तव में गारंटी दे सकता है, या आप कर सकते हैं?)

मुझे लगता है कि एक कच्चे पीआरटी पास हो गया है, अगर इसे पूरी तरह इस्तेमाल किया जा रहा है, तो कुछ सुरक्षा की आवश्यकता होगी?

+1

आप स्थिर होने दो पूरी तरह से अलग अलग अर्थ से उलझन में हैं। आप अकेले नहीं हैं, शायद यही कारण है कि एक स्टैंडअलोन फ़ंक्शन पर स्थैतिक अब बहिष्कृत है। – Suma

उत्तर

8

वे स्थानीय हैं जब तक कि आप उन्हें static घोषित न करें - फ़ंक्शन के प्रत्येक आमंत्रण में चर की अपनी प्रति होगी और आपको उनकी रक्षा करने की आवश्यकता नहीं है।

+6

@ टी 33 सी: उसके पास एक स्थिर 'स्थानीय' कहां है, मुझे आश्चर्य है? – sharptooth

+1

कुछ लोग 'स्थिर स्थानीय चर' के साथ 'स्थैतिक कार्यों 'को भ्रमित करते हैं, जबकि दोनों के बीच व्यावहारिक रूप से कोई संबंध नहीं है। –

+1

@ टी 33 सी: आप गलत हैं। चर स्पष्ट रूप से स्थैतिक नहीं है (भले ही कार्य है)। अपने -1 –

1

myintsomefunc के लिए स्थानीय है और आपको इसे थ्रेड में सुरक्षित रखने की आवश्यकता नहीं है।

1

आपके उदाहरण में मायिंट एक स्थानीय चर है, हर बार कुछफन को माइंट जीवन कहा जाता है। लेकिन उससे ज्यादा नहीं।

मींट क्योंकि इसके एक स्थानीय चर

1

myint सही मायने में स्थानीय हो जाएगा संरक्षित करने की जरूरत नहीं है। आपको इसकी सुरक्षा करने की चिंता करने की ज़रूरत नहीं है। स्मृति में प्रत्येक एकल कॉल कॉल के लिए myint के लिए स्टैक पर एक अलग स्थान बनाया जाएगा।

1

myint परिवर्तनीय स्थानीय रहेगा, इसलिए उनकी रक्षा करने की कोई आवश्यकता नहीं है क्योंकि प्रत्येक थ्रेड स्थानीय चर साझा नहीं करेगा।

1

स्थैतिक कुंजी-शब्द का अर्थ है कि फ़ंक्शन को छुपाया नहीं जाएगा "यह" तर्क। इसके अलावा फ़ंक्शन को क्लास इंस्टेंस डेटा तक पहुंच नहीं होगी। फ़ंक्शन के स्थिर क्वालीफायर का फ़ंक्शन के स्थानीय डेटा पर कोई प्रभाव नहीं पड़ता है।

static RetType SomeClass::SomeMethod(Type arg) एक नि: शुल्क समारोह के रूप में एक ही "प्रकार" RetType SomeFunc(Type arg)

सादर,
मार्सिन

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