2010-03-17 10 views
25

में स्थिर म्यूटेक्स का उपयोग करना मेरे पास एक कक्षा है जिसमें मेरे कई उदाहरण हो सकते हैं। इसके अंदर किसी तृतीय पक्ष लाइब्रेरी (जो कुछ वैश्विक चर का उपयोग करते हैं) से कुछ सदस्यों को बनाता है और प्रारंभ करता है और थ्रेड-सुरक्षित नहीं है।कक्षा

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



class MyClass 

{ 
    static boost::mutex mx; 

    // 3rd party library members 
public: 
    MyClass(); 
    ~MyClass(); 
}; 

MyClass::MyClass() 
{ 
    boost::mutex::scoped_lock scoped_lock(mx); 
    // create and init 3rd party library stuff 
} 

MyClass::~MyClass() 
{ 
    boost::mutex::scoped_lock scoped_lock(mx); 
    // destroy 3rd party library stuff 
} 
 

क्योंकि मैं त्रुटि प्राप्त मैं लिंक नहीं कर सकते:

undefined reference to `MyClass::mx` 
  1. मैं ऐसे स्थिर सदस्य की कुछ विशेष प्रारंभ की ज़रूरत है?

  2. क्या स्थिर म्यूटेक्स का उपयोग करने में कुछ गड़बड़ है?


संपादित करें: लिंक करना समस्या सीपीपी

boost::mutex MyClass::mx; 
+1

यदि आप एक स्थिर म्यूटेक्स का उपयोग करते हैं, तो आप अपने वर्ग के सभी * उदाहरणों के उपयोग को क्रमबद्ध कर देंगे, मल्टीथ्रेडिंग के माध्यम से प्राप्त होने वाले किसी भी लाभ को पूरी तरह से अस्वीकार कर सकते हैं। क्या आप वाकई यह चाहते हैं? –

+0

@ जॉन डिबलिंग हां, केवल वस्तुओं को बनाना और नष्ट करना सुरक्षित रहेगा - यह अक्सर नहीं होगा। शेष समय mutex को लॉक किए बिना उदाहरणों का उपयोग किया जाएगा और यह काफी कुशल होना चाहिए। –

+0

@Dmity: जो मुझे मेरे अगले प्रश्न पर ले जाता है: क्या आप सुनिश्चित हैं कि लॉक किए बिना उदाहरणों का उपयोग करना सुरक्षित रहेगा? –

उत्तर

37

आप घोषणा की है में सही परिभाषा के साथ तय हो गई है, लेकिन अपने वर्ग स्थिर म्युटेक्स परिभाषित नहीं। बस

boost::mutex MyClass::mx; 

MyClass के कार्यान्वयन के साथ सीपीपी फ़ाइल में जोड़ें।

+0

10x, इसने लिंकिंग समस्या को ठीक किया। मैंने इसे पहले परिभाषित करने की कोशिश की लेकिन MyClass :: mx से पहले इस प्रकार को याद किया –