2012-11-15 14 views
8

समस्या:स्मार्ट समाधान

मैं बूस्ट के साथ एक सर्वर के विकास कर रहा हूँ और एक xml फ़ाइल जिसमें से कुछ डेटा प्रारंभ में मुख्य थ्रेड से भरी हुई है है ।

निष्पादन के दौरान कुछ परिवर्तन हो सकते हैं और xml फ़ाइल में संग्रहीत किया जाना चाहिए। इस प्रयोजन के लिए एक समारोह की दुकान() एक वर्ग कहा जाता है डाटाबेस में लागू किया गया था:

Database::store() 
{ 
    boost::mutex::scoped_lock lock(_databaseMutex); 
    //xml file wirting 
} 

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

Posible समाधान:

मेरा विचार अन्य धागे से सूचनाओं के लिए इंतजार कर, कुछ इस तरह सर्वर (मुख्य थ्रेड) में एक पाश बनाने के लिए है:

void loopQueue() 
{ 
    boost::mutex::scoped_lock lock(_queueMutex);  // close the lock  
    while(true) 
    { 
     while (_queuedActions.empty()) 
     { 
      _updateAvailable.wait(lock); 
     }   
     getDatabase(param)->store();  //stores database 
     _queuedActions.pop(); 
    } 
} 

इस तरह एक्सएमएल लेखन करता है क्रैश नहीं

प्रश्न:

  • वहाँ इस तरह की समस्या के लिए एक अधिक कुशल या बेहतर समाधान है या यह सही तरीका है?

उत्तर

3

यह सब इस बात पर निर्भर करता है कि मुख्य धागा क्या कर रहा है और प्रोग्राम कैसे डिज़ाइन और कार्यान्वित किया गया है।

आपके द्वारा प्रस्तावित समाधान ठीक काम करेगा, लेकिन यह प्रसंस्करण के लिए केवल एक थ्रेड को एक्सएमएल फ़ाइल में लिखता है।

क्या आप boost::asio से परिचित हैं?

किसी भी सर्वर में मैं boost::asio का उपयोग एकल धागे या धागे के पूल के साथ ioservice::run पर कर सकता हूं। एक्सएमएल फ़ाइल के अपडेट्स को एएसओ इवेंट लूप में "पोस्ट किया गया" है और किसी भी वर्कर थ्रेड द्वारा अपने थ्रेडपूल में प्रेषित/निष्पादित किया जाता है (यानी थ्रेड जिन्हें Ioserive :: run कहा जाता है)। इसका मतलब यह है कि आप सिस्टम कम धागे का उपयोग करता है और इसका उपयोग करने वाले थ्रेड असीमित सिंक्रनाइज़ेशन करने में सक्षम हैं।

नोट: boost::asio::post, एक समारोह asio घटना पाश के भीतर बुलाया है करने के लिए प्रयोग किया जाता है यह आप पर नियंत्रण/xml फ़ाइल के लिए उपयोग को क्रमानुसार करने की अनुमति देता है

देखें: boost::asio boost::asio::post

+1

मैं इस बारे में पढ़ रहा हूँ विषय अभी, यह एक थ्रेड प्रति कनेक्शन के लिए भी दिलचस्प लग रहा है। –

+1

एक थ्रेड पूल का उपयोग करने का सबसे अच्छा तरीका है। प्रति कनेक्शन एक थ्रेड को स्केल करना स्केल नहीं करता है यदि आपके सर्वर को बड़ी संख्या में विभिन्न कनेक्शनों को संभालने की आवश्यकता है (उदा। वीओआईपी स्विच कॉल के 1000s को संभालने)। 'बूस्ट :: एएसआईओ' के साथ प्रदान किए गए उदाहरण सरल और जटिल परिदृश्य दोनों को कवर करते हैं, दुर्भाग्यवश कुछ जटिल परिदृश्यों को समझाया/दस्तावेज नहीं किया गया है।यहां कुछ उत्कृष्ट संसाधन हैं, जो 'बूस्ट :: एएसओ' के साथ बहु-थ्रेडेड सर्वर विकसित करने के लिए विभिन्न तकनीकों की व्याख्या करते हैं। आईएमएचओ 'बूस्ट :: एएसआईओ' सबसे अच्छी लिखित/सबसे उपयोगी, सी ++ पुस्तकालयों में से एक है जिसका मैंने उपयोग किया है। – mark

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