2010-07-27 11 views
6

एक सी ++ प्रोग्राम में, मैं दो संदर्भ गिना वस्तुओं की है। राजा को नष्ट होने तक वारिस को अवरुद्ध करने की जरूरत है। राजा एक संदर्भ गिनती वस्तु है जिसे संदर्भित किया जाना चाहिए जब संदर्भ गणना शून्य हो जाती है। यदि वार के पास राजा का संदर्भ है, तो राजा की संदर्भ संख्या शून्य पर कभी नहीं जाएगी। राजा नष्ट होने तक हीर ब्लॉक कैसे हो सकता है?सी ++ वस्तु समाप्ति अधिसूचना

उत्तर

10

आप how weak_ptr works के समान गैर-स्वामित्व (या "कमजोर") संदर्भ का उपयोग कर सकते हैं।

राजा मरने तक प्रतीक्षा करने के लिए, आप एक म्यूटेक्स का उपयोग कर सकते हैं कि जब तक वह मर जाए तब तक राजा पकड़ सकता है और वारिस ब्लॉक को राजा को छोड़ने का इंतजार कर रहा है।

यदि आपको कई उत्तराधिकारी इंतजार करने की आवश्यकता है और उत्तराधिकारियों को कुछ आदेश देने की आवश्यकता है, तो आपके पास "वारिस चयनकर्ता" ऑब्जेक्ट हो सकता है जो वारिस की सूची और उनके प्राथमिकता के क्रम का ट्रैक रखता है, और जब राजा रिलीज़ करता है mutex यह उस म्यूटेक्स के स्वामित्व को सूची में अगले उत्तराधिकारी को सौंपेगा।

+0

बह .. हमने एक ही चीज़ का उत्तर दिया और आपने प्रतीक्षा भाग पर थोड़ा और जोड़ा। मेरा हटा दिया और तुम्हारा ऊपर उठाया। बस जोड़ने के लिए, वारिस को राजा को कमजोर_पीटीआर संदर्भ रखना चाहिए। अधिसूचना –

+0

+1 कमजोर_पीआरआर काम नहीं करेगा - कम से कम मतदान के बिना नहीं। राजा पर अवरुद्ध करने की विधि को निष्पादित करने के लिए, आपको कमजोर-पीआरटी को संदर्भित करना होगा। जब ऐसा होता है, तो आप ऑब्जेक्ट का एक मजबूत संदर्भ प्राप्त करते हैं और इसे तब तक पकड़ते हैं जब तक यह दायरे में न हो। –

+0

के लिए mutex का उपयोग करने के लिए – brianegge

0

धन्यवाद @ जेम्स। यहां समाधान है जिसके साथ मैं समाप्त हुआ:

म्यूटेक्स विधि वादाजनक लग रहा था, लेकिन अधिकांश म्यूटेक्स प्राप्त करने वाले धागे की अपेक्षा करते हैं और थ्रेड को समान मानते हैं। अंत में, मैंने वारिस को स्टैक पर शून्य की गिनती के साथ एक सेमफोर बनाया, राजा को सैमफोर में एक पॉइंटर पास किया, राजा को छोड़ दिया, और फिर सेमफोर हासिल करने का प्रयास किया। गिनती शून्य है, इसलिए वारिस तुरंत ब्लॉक करता है। जब राजा के विनाशक को बुलाया जाता है, तो यह सैमफोर पर 'रिलीज' कहता है। यह रॉग वेव सेमफोर के साथ ठीक काम करता प्रतीत होता है।

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