2013-05-30 7 views
8

मेरे पास सी ++ में अपेक्षाकृत जटिल कक्षा है। यह एक प्रक्रिया के भीतर इस्तेमाल होने पर पूरी तरह से काम करता है। हालांकि, अब मैं कई प्रक्रियाओं को इस वर्ग के एक ऑब्जेक्ट इंस्टेंस को साझा करने में सक्षम होना चाहता हूं। एक प्रक्रिया (मास्टर) ऑब्जेक्ट के पढ़ने और लिखने के कार्यों तक पहुंच जाएगी, जबकि अन्य 2 प्रक्रियाएं (गुलाम) केवल पढ़ने के कार्यों का उपयोग करेंगी। मैं जितना संभव हो सके वर्ग को संशोधित करना चाहता हूं। अब तक मैंने सिंगलेट और साझा स्मृति को माना है, लेकिन न तो आदर्श या सीधा लगता है। यह एक शोध अनुप्रयोग है जो लिनक्स पर कभी भी मेरे द्वारा उपयोग किया जाएगा। सबसे आसान संभव समाधान क्या है?सी ++ एकाधिक प्रक्रियाओं के बीच सिंगल क्लास ऑब्जेक्ट साझा करना

बहुत बहुत धन्यवाद!

संपादित करें: बिल्कुल स्पष्ट है कि, प्रश्नकर्ता कई भर में एक वस्तु को बांटने प्रक्रियाओं, नहीं धागे में रुचि रखता है।

+1

मैं इसे इस्तेमाल नहीं किया है, लेकिन आप की [Boost.Interprocess] (http बारे में पता किया जा रहा है का उल्लेख नहीं है: //www.boost। org/doc/libs/1_53_0/doc/html/interprocess.html)। – BoBTFish

+0

आप 'साझा स्मृति' के लिए खोजना चाह सकते हैं। [यहां SO पर एक प्रश्न] (http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c) लेकिन 'सी' के लिए (चुड़ैल सी ++ के लिए भी काम कर सकता है) – A4L

उत्तर

1

एक विचार प्रक्रियाओं के बीच डेटा साझा करने के लिए सॉकेट या सॉकेट लाइब्रेरी का उपयोग करना हो सकता है। एक पुस्तकालय जो इसके लिए बहुत आसान लगता है ØMQ हो सकता है। आप Boost::Asio का उपयोग करने का प्रयास भी कर सकते हैं जो थोड़ा अधिक जटिल है।

आप ØMQ here के लिए एक छोटा सा उदाहरण पा सकते हैं।

0

मुझे लगता है कि सबसे सरल कोडिंग समाधान ग्लोबल (या क्लास इंस्टेंस) म्यूटेक्स वाला सिंगलटन होगा, हालांकि इसका सिंगलटन हिस्सा वैकल्पिक है। मैं व्यक्तिगत रूप से सोचता हूं कि सिंगलेट्स एक अतिव्यापी मुहावरे बनने के लिए है। आप पर निर्भर करता है कि क्या आपको लगता है कि इस मामले में अच्छा डिजाइन है या नहीं। वास्तव में, ग्लोबल म्यूटेक्स जोड़ना आपको चाहिए।

इंटरप्रोसेस भाग के लिए, मैं बढ़ावा देने की सलाह देता हूं।

http://www.boost.org/doc/libs/1_36_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.semaphores.semaphores_interprocess_semaphores

3

अंतर संचार प्रक्रिया कभी नहीं सरल है। आप आईपीसी/आरपीसी के लिए लाइब्रेरी का उपयोग करना चाह सकते हैं और पूरे वर्ग को डेटा पढ़ने के लिए गुलामों का उपयोग केवल उस समारोह को बेनकाब कर सकते हैं।

मैं आपको कोई अच्छी सिफारिश नहीं दे सकता क्योंकि मुझे कभी ऐसी लाइब्रेरी नहीं मिली है जिसने इसे सरल बना दिया है और मुझे इसके साथ अधिक अनुभव नहीं है।

1

एक विकल्प यह है कि मास्टर और दास प्रक्रिया दोनों एक ही वस्तु के उदाहरण बनाते हैं। चूंकि मास्टर प्रक्रिया इस 'साझा' ऑब्जेक्ट को संशोधित करने वाला एकमात्र व्यक्ति होगा, इसलिए इसे केवल 'साझा' ऑब्जेक्ट में किए गए किसी भी बदलाव के लिए दास प्रक्रियाओं को चेतावनी देना चाहिए। ऐसा करने के लिए, आप एक मैसेजिंग सिस्टम सेट कर सकते हैं जो मास्टर प्रक्रिया दास प्रक्रियाओं के साथ साझा ऑब्जेक्ट में परिवर्तनों को संवाद करने के लिए उपयोग करेगी। यहां दोष यह है कि दास प्रक्रियाएं मास्टर के साथ समन्वयित होने पर साझा ऑब्जेक्ट का संदर्भ दे सकती हैं, लेकिन यह प्रतिकृति में एक आम समस्या है। इसके अलावा, आप मास्टर/दास अनुप्रयोगों को विकसित/बनाए रखने के लिए आसान बनाने के लिए आरपीसी ओवरले का उपयोग कर सकते हैं।

मैं कोशिश करूँगा और नीचे दिए गए इस डिज़ाइन का एक उच्च स्तर का उदाहरण प्रदान करूंगा।असली कोड और psuedo कोड का उपयोग करने के लिए मुझे माफ कर दो; मैं पूरी तरह से कोड नहीं करना चाहता था इस, लेकिन यह भी कि यह सिर्फ टिप्पणी :)

यहाँ से बना होने के लिए नहीं करना चाहता था हमारी साझा उद्देश्य यह है कि दोनों मास्टर/दास कोड

struct sharedobj { 
    int var1; 
}; 

में परिभाषित किया जाता है है यहाँ साझा वस्तु और प्रचार को अद्यतन करने के मास्टर प्रक्रिया का एक उदाहरण परिवर्तन

int counter = 0; 
sharedobj mysharedobj; 
while(true){ 
    //update the local version first 
    mysharedobj.var1 = counter++; 

    //then call some function to push these changes to the slaves 
    updateSharedObj(mysharedobj); 
} 

है यहाँ समारोह है कि दास को मास्टर की परिवर्तन से प्रसारित नहीं है;

updatedSharedObj(sharedobj obj){ 

    //set up some sort of message that encompasses these changes 
    string msg = "var1:" + the string value of obj.var1; 

    //go through the set of slave processes 
    //if we've just done basic messaging, maybe we have a socket open for each process 
    while(socketit != socketlist.end()){ 

    //send message to slave 
    send(*socketit, msg.c_str(),msg.length(),0); 

    } 

} 

और यहां दास कोड है जो इन परिवर्तनों को प्राप्त करता है और इसकी 'साझा' वस्तु अपडेट करता है; सबसे अधिक संभावना है कि किसी अन्य थ्रेड में चल रहा है, इसलिए दास बिना रोक दिए और ऑब्जेक्ट अपडेट की जांच कर सकता है।

while(true){ 

    //wait on the socket for updates 
    read(mysock,msgbuf,msgbufsize,0); 

    //parse the msgbuf 
    int newv1 = the int value of var1 from the msg; 

    //if we're in another thread we need to synchronize access to the object between 
    //update thread and slave 
    pthread_mutex_lock(&objlock); 

    //update the value of var1 
    sharedobj.var1 = newv1; 

    //and release the lock 
    pthread_mutex_unlock(&objlock); 

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