c++ - shared_ptr - pass by value vs pass by reference -


मान लीजिए कि मेरे पास है:

  typedef बढ़ावा :: share_ptr & lt; घटना & gt; EventPtr;   

एक थ्रेड पर, मैं एक इवेंट बना रहा हूं और प्रेषित करने के लिए इसे भेज रहा हूं:

  इवेंट * इवेंट = नया घटना (); इवेंटप्रटी इवेंटप्रटी (इवेंट); EventDispatcher :: प्रेषण (eventPtr); // स्यूडोकोड   

EventDispatcher एक EventPtr प्राप्त करता है और इसे एक कतार में जोड़ता है जो किसी दूसरे थ्रेड में संसाधित हो जाता है ... लेकिन इसके लिए एक उपयुक्त विधि हस्ताक्षर क्या है प्रेषण विधि? <पूर्व> प्रेषण (ईवेंटप्रेंट इवेंट); // पुश_बैक (इवेंट)

या <पूर्व> प्रेषण (कॉन्स्ट इवेंटप्रटी एंड इवेंट); // पुश_बैक (ईवेंट);

यह देखते हुए कि मेरा इवेंट डिस्पैचर की एक कतार है:

  typedef std :: queue & lt; EventPtr & gt; घटना क़तार घटना   

फिर बाद में, अन्य धागा कतार बंद एक घटना पॉप और घटना पर कार्रवाई करने के लिए इसे कुछ हाथ:

  EventPtr घटना = theQueue.front (); EventProcessor :: प्रक्रिया (घटना); // स्यूडोकोड theQueue.pop ();   

फिर, प्रक्रिया विधि के लिए एक उपयुक्त विधि हस्ताक्षर क्या है? मैं सोच रहा हूं कि क्या मैं प्रक्रिया विधि में नग्न ईवेंट * पास कर सकता हूं?

मुझे लगता है कि मैं सोच रहा हूं कि मुझे मूल्य से गुजरना चाहिए, इसलिए संदर्भ संख्या सही है? मैं वाकई इस तथ्य के बारे में चिंतित हूं कि एक धागा कतार पर खड़े हो रहा है और दूसरा धागा कतार बंद हो रहा है और मैं कहीं संकेतों को रिसाव नहीं करने जा रहा हूं ...

धन्यवाद!

EventDispatcher एक EventPtr प्राप्त करता है और इसे एक कतार में जोड़ता है जो किसी अन्य थ्रेड में संसाधित हो जाता है ... लेकिन प्रेषण विधि के लिए एक उचित विधि हस्ताक्षर क्या है?

या तो सुझाव ठीक है; कॉन्स्ट संदर्भ से गुजरना संभवतः अधिक कुशल होगा, क्योंकि उसे संकेतक की संदर्भ संख्या को संशोधित करने की आवश्यकता नहीं होगी। या तो मामले में, push_back कतार पर पॉइंटर की प्रतिलिपि रखता है, घटना को जीवित रहने के दौरान कतार में रखता है।

दोबारा, एक उचित विधि क्या है प्रक्रिया विधि के लिए हस्ताक्षर? मैं सोच रहा हूं कि मैं प्रक्रिया प्रक्रिया में नग्न इवेंट * पास कर सकता / सकती हूं?

साझा पॉइंटर (मूल्य या संदर्भ द्वारा) को स्पष्ट रूप से दस्तावेज और घटना के स्वामित्व को लागू करने के लिए, और कॉल करने के बाद प्रक्रिया () कॉल करने के बाद प्रोसेसर को इसे रखने की अनुमति देगा। एक कच्चे सूचक पास करने से स्वामित्व में अनिश्चितता होती है; प्रोसेसर को यह बताते हुए एक अनुबंध की आवश्यकता होगी कि वह इस घटना का स्वामित्व नहीं ले रहा है, और प्रक्रिया () समाप्त हो जाने के बाद इसे एक्सेस करने का प्रयास नहीं करना चाहिए।

Comments