एक विकल्प यह है कि मास्टर और दास प्रक्रिया दोनों एक ही वस्तु के उदाहरण बनाते हैं। चूंकि मास्टर प्रक्रिया इस 'साझा' ऑब्जेक्ट को संशोधित करने वाला एकमात्र व्यक्ति होगा, इसलिए इसे केवल 'साझा' ऑब्जेक्ट में किए गए किसी भी बदलाव के लिए दास प्रक्रियाओं को चेतावनी देना चाहिए। ऐसा करने के लिए, आप एक मैसेजिंग सिस्टम सेट कर सकते हैं जो मास्टर प्रक्रिया दास प्रक्रियाओं के साथ साझा ऑब्जेक्ट में परिवर्तनों को संवाद करने के लिए उपयोग करेगी। यहां दोष यह है कि दास प्रक्रियाएं मास्टर के साथ समन्वयित होने पर साझा ऑब्जेक्ट का संदर्भ दे सकती हैं, लेकिन यह प्रतिकृति में एक आम समस्या है। इसके अलावा, आप मास्टर/दास अनुप्रयोगों को विकसित/बनाए रखने के लिए आसान बनाने के लिए आरपीसी ओवरले का उपयोग कर सकते हैं।
मैं कोशिश करूँगा और नीचे दिए गए इस डिज़ाइन का एक उच्च स्तर का उदाहरण प्रदान करूंगा।असली कोड और 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);
}
मैं इसे इस्तेमाल नहीं किया है, लेकिन आप की [Boost.Interprocess] (http बारे में पता किया जा रहा है का उल्लेख नहीं है: //www.boost। org/doc/libs/1_53_0/doc/html/interprocess.html)। – BoBTFish
आप 'साझा स्मृति' के लिए खोजना चाह सकते हैं। [यहां SO पर एक प्रश्न] (http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c) लेकिन 'सी' के लिए (चुड़ैल सी ++ के लिए भी काम कर सकता है) – A4L