2012-12-28 20 views
5

मान लें चलो मेरे पास है एक:थ्रेड सुरक्षा और स्थिर कार्यों

class base 
{ 
    base(){f(this);}; 

    static void f(base * b) {(b->d)++;}; 

    int d; 
}; 

अब अगर 2 अलग धागे पर मैं प्रकार आधार की एक वस्तु बनाने के लिए, विधि धागा सुरक्षित माना जा f हैं? मैं इस सवाल से पूछ रहा हूं क्योंकि आमतौर पर मुझे पता है कि थ्रेड सुरक्षित होने के तरीके के लिए इसे स्थिर सदस्यों और न ही वैश्विक चर का उपयोग नहीं करना चाहिए। लेकिन जैसा कि आप उपर्युक्त उदाहरण से देख सकते हैं, मैंने तय किया कि वे d स्थिर नहीं बनाते हैं, इसके बजाय मैं इसे आधार के चल रहे उदाहरण के माध्यम से कॉल करता हूं।

इसके अलावा, मुझे लगता है कि मुझे इस लाइन की रक्षा करने की आवश्यकता नहीं है: (b->d)++; एक म्यूटेक्स के साथ क्योंकि प्रत्येक थ्रेड के आधार और परिवर्तनीय डी का एक अलग उदाहरण होगा।

क्या मैं अपने विश्लेषण में सही हूं? क्या मुझे कुछ भी सावधान रहना चाहिए?

+1

आप सही हैं, जब तक कि बेस पॉइंटर्स थ्रेड विशिष्ट हैं, आप अच्छे हैं। – perreal

+0

क्या आप अपने प्रोग्राम को संकलित करने में सक्षम हैं? इसे एक संकलन त्रुटि – stamhaney

+0

@stamhaney फेंकना चाहिए, नहीं, मैं सिर्फ सिद्धांत को काम करने की कोशिश नहीं कर रहा हूं :) कृपया समस्या को इंगित करें हालांकि – Kam

उत्तर

7

हां, आपका कन्स्ट्रक्टर थ्रेड सुरक्षित है, क्योंकि यह केवल आवृत्ति चर (विशेष रूप से, d) तक पहुंचता है। यह अपरिभाषित व्यवहार प्रदर्शित करता है, क्योंकि यह वृद्धि को करने के लिए अनियमित d से पढ़ता है, लेकिन इसमें थ्रेड सुरक्षा के साथ कुछ लेना देना नहीं है।

base(): d(0) {f(this);}; 

अब जब कि d प्रारंभकर्ता सूची में आरंभ नहीं हो जाता, अपने कार्यक्रम एक उम्मीद के मुताबिक रास्ते में बर्ताव करता है:

यहाँ आप अपरिभाषित व्यवहार को कैसे ठीक कर सकते हैं।

+0

धन्यवाद :) यह सही है – Kam

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