2011-01-06 13 views
16

स्थिर सदस्य फ़ंक्शन में बनाए गए ऑब्जेक्ट्स और वेरिएबल को 'लोकल' नहीं माना जाता है क्योंकि वे सदस्य फ़ंक्शन में होते हैं, ताकि उन्हें अब कई थ्रेड के बीच साझा किया जा सके?स्थैतिक सदस्य फ़ंक्शंस और थ्रेड-सुरक्षा

जबकि यदि आपके पास कोई सदस्य फ़ंक्शन है जो कुछ ऑब्जेक्ट बनाता है, तो यह थ्रेड के लिए स्थानीय होगा और इसलिए यह साझा नहीं किया गया है।

क्या मैं यह कहने में सही हूं?

+0

[स्थिर सदस्य फ़ंक्शन और थ्रेड-सुरक्षा] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4509850/static-member-function-and-thread-safety) – Suma

+5

टोनी, क्यों, पृथ्वी पर, आप हैं एक ही सवाल फिर से पूछना? – Suma

+0

@ सुमा मैंने अपना खुद का प्रश्न बंद करने के लिए वोट दिया, भूल गया मैंने पहले ही यह पूछा था ... –

उत्तर

19

नहीं, आप सही नहीं हैं।

एक स्थैतिक फ़ंक्शन में बनाए गए ऑब्जेक्ट्स साझा नहीं हैं, और यह किसी भी सामान्य कार्यों के मामले में भी है।

ऑब्जेक्ट्स को साझा किया जा सकता है हालांकि उन्हें स्वयं स्थिर घोषित किया गया है, और यह निर्भर नहीं है कि फ़ंक्शन स्थिर है या नहीं।

void myFunc() 
{ 
    static MyObject o; 
    o.CallMethod(); // here o is shared by all threads calling myFunc 
} 

जब एक वस्तु स्थिर घोषित किया जाता है, यह है के रूप में अगर वस्तु एक वैश्विक चर रहा था, लेकिन तभी काम करते है कि यह में घोषित किया जाता है के दायरे में दिखाई दे रहा।

+0

ऑब्जेक्ट बनाने के कम से कम 3 तरीके हैं। एक्स एक्स; एक्स * एक्स = नया एक्स; एक्स * एक्स = नया (ज्ञापन) एक्स –

+0

@ मैक्सिम और उन्हें ** ** ** इस तरह से साझा किया जाएगा: 'स्थिर एक्स एक्स; स्थैतिक एक्स * एक्स = नया एक्स; 'आपकी टिप्पणी का मतलब क्या है/मतलब है? यह अस्पष्ट है! –

+0

यह: एक्स * एक्स = नया (मेम) एक्स; थ्रेड या प्रक्रियाओं के बीच साझा ऑब्जेक्ट बना सकते हैं। और यह एक स्थिर सदस्य फ़ंक्शन से किया जा सकता है, जो आपके कथन को साबित करता है "एक स्थैतिक फ़ंक्शन में बनाए गए ऑब्जेक्ट्स साझा नहीं किए जाते हैं" गलत। –

1

इससे कोई फ़र्क नहीं पड़ता कि कोई फ़ंक्शन स्थिर है या नहीं (क्लास विधि)। फ़ंक्शन में केवल स्वचालित चर को स्थानीय के रूप में देखा जा सकता है। यदि आपके पास उन डेटा का पता है, तो आप इसे एक्सेस कर सकते हैं।

आप उदाहरण का उपयोग कर सकते हैं thread-local storage एक समर्पित थ्रेड संदर्भ में अपना आउटपुट असाइन करने के लिए।

3

नहीं, आप सही नहीं हैं। और हां, सी ++ शब्द "स्थैतिक" पर बहुत अधिक उपयोग करता है।

एक स्थैतिक वर्ग सदस्य चर एक निश्चित रूप से कक्षा के साथ एक नामस्थान स्कोप के रूप में कार्यरत है और कुछ निजी विशेषाधिकारों के अंतर के साथ कुछ विशिष्ट विशेषाधिकार अंतर है (केवल कक्षा द्वारा ही पहुंचा जा सकता है)।

हालांकि स्थिर वर्ग सदस्य फ़ंक्शन नियमित रूप से नि: शुल्क फ़ंक्शन (वर्ग सदस्य नहीं) की तरह है और इसे हर बार कॉल करने पर अपने स्थानीय चर होते हैं।

अपने नामकरण सम्मेलन के अलावा एक स्थिर वर्ग सदस्य समारोह और एक नियमित फ्री-फ़ंक्शन के बीच एकमात्र वास्तविक अंतर यह है कि उसके पास कक्षा के निजी सदस्यों तक पहुंच है (और एक के बाहरी "उदाहरण" की आवश्यकता है)।

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

किसी भी समारोह में एक स्थिर "स्थानीय" चर एक तरफ एक उदाहरण है, दूसरी तरफ, वैश्विक की तरह थोड़ा सा है और थ्रेड-विवाद के मुद्दों के प्रति संवेदनशील है क्योंकि फ़ंक्शन को कॉल करने वाले दो थ्रेड एक ही उदाहरण तक पहुंचते हैं।

39

इस वर्ग

class CData 
{ 
public: 
    static void func() 
    { 
     int a; 
     static int b; 
    } 

    int c; 
    static int d; 
}; 

int main() 
{ 
    CData::func(); 
} 

अब चर afunc() से प्रत्येक कॉल करने के लिए स्थानीय है पर विचार करें। यदि दो धागे एक ही समय में func() पर कॉल करते हैं, तो उन्हें a के विभिन्न संस्करण मिलते हैं।

b एक स्थिर स्थानीय है।मान func() की विभिन्न कॉल के बीच बनी हुई है। यदि दो धागे एक ही समय में func() पर कॉल करते हैं, तो वे b के समान संस्करण तक पहुंचते हैं ताकि उन्हें सिंक्रनाइज़ेशन करने की आवश्यकता हो।

c एक उदाहरण चर है; यह सीडीटा के एक विशेष तत्कालता से जुड़ा हुआ है। func()c तक नहीं पहुंच सकता है, एक चाल के अलावा मैं नीचे दिखाऊंगा।

d एक स्थिर चर है। d का एक उदाहरण क्लास सीडीटा के सभी उपयोगों के बीच साझा किया गया है, इसलिए सिंक्रनाइज़ेशन आवश्यक हो सकता है। इसका उपयोग स्थिर फ़ंक्शन func() से आसानी से किया जा सकता है।

एक स्थिर फ़ंक्शन से इंस्टेंस डेटा तक पहुंचने के लिए उपयोग की जाने वाली चाल फ़ंक्शन में मान्य ऑब्जेक्ट को पास करना है।

उदा।

class CData 
{ 
public: 
    static void func(CData *p) 
    { 
     int a; 
     static int b; 

     b = p->c; 
    } 

    int c; 
    static int d; 
}; 

int main() 
{ 
    CData data; 
    CData::func(&data); 
} 

आशा है कि मदद करता है।

+4

अच्छा स्पष्टीकरण दोस्त! – Meysam

+2

यह अब तक का सबसे अच्छा स्पष्टीकरण है जिसे मैंने देखा है। धन्यवाद। मुझे बहुत मदद की! – AnyOneElse

+1

कुरकुरा और स्पष्ट! सबसे अच्छा स्पष्टीकरण मैं आया, बिंदु पर, एक टन धन्यवाद! – ADJ

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