2010-05-25 7 views
7

boost::intrusive_ptr को intrusive_ptr_add_ref और intrusive_ptr_release परिभाषित करने की आवश्यकता है। एक बेस क्लास क्यों प्रदान नहीं किया जाता है जो यह करेगा? यहां एक उदाहरण दिया गया है: http://lists.boost.org/Archives/boost/2004/06/66957.php, लेकिन पोस्टर कहता है "मुझे जरूरी नहीं लगता कि यह एक अच्छा विचार है"। क्यों नहीं?intrusive_ptr: एक सामान्य आधार वर्ग क्यों प्रदान नहीं किया जाता है?

अपडेट: मुझे नहीं लगता कि इस वर्ग का एकाधिक विरासत के साथ दुरुपयोग किया जा सकता है। किसी भी वर्ग जो कई आधार वर्गों से प्राप्त होती है, उनके संदर्भ संख्या के साथ एक ही समस्या होगी। चाहे इन रिफ्रेंस को बेस क्लास के माध्यम से लागू किया गया हो या कोई फर्क नहीं पड़ता।

मुझे नहीं लगता कि मल्टीथ्रेडिंग के साथ कोई समस्या है; boost::shared_ptr परमाणु संदर्भ गिनती प्रदान करता है और यह वर्ग भी हो सकता है।

+3

एक संबंधित नोट, 'OSG :: OpenSceneGraph पुस्तकालय से ref_ptr' पर एक शीर्ष स्तर आम आधार वर्ग (का उपयोग करता है 'osg :: संदर्भित') इसके घुसपैठ स्मार्ट सूचक कार्यान्वयन के लिए। –

+3

और osg :: संदर्भित :: boostusive_ptr के साथ संगत है क्योंकि यह intrusive_ptr_add_ref() और intrusive_ptr_release() फ़ंक्शंस प्रदान करता है। अच्छी तरह से काम। –

उत्तर

2

बूस्ट इसके लिए एक सुविधा प्रदान करता है। यह या तो धागे की सुरक्षित या धागे की असुरक्षित refcounting के लिए विन्यस्त किया जा सकता:

#include <boost/intrusive_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ref_counter.hpp> 

class CMyClass 
    : public boost::intrusive_ref_counter< 
           CMyClass, 
           boost::thread_unsafe_counter> 
    ... 

boost::intrusive_ptr<CMyClass> myPtr; 

http://www.boost.org/doc/libs/1_62_0/libs/smart_ptr/intrusive_ref_counter.html

+0

दूसरे शब्दों में मेरे प्रश्न का उत्तर है, "वहां होना चाहिए, और अब वहां है" :) – Jon

+0

ऐसा लगता है कि यह थोड़ी देर के लिए रहा है, लेकिन थोड़ा सा स्थानांतरित हो गया। यहां पाया गया सबसे पुराना दस्तावेज़ संदर्भ यहां दिया गया है: http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/utilities.html#header.boost.log.utility.intrusive_ref_counter_hpp –

3

समस्या एकाधिक विरासत के साथ होगी। यदि आप इस आधार को लागू करने वाली 2 वस्तुओं से प्राप्त होते हैं, तो आपके पास अपने एकल ऑब्जेक्ट के लिए 2 काउंटर हैं ... और इससे विनाश हो सकता है।

इस प्रकार आप ptr_add और ptr_release तरीकों आभासी बनाने के लिए है, ताकि व्युत्पन्न वर्ग एक ओवरराइड ठीक से एक साथ कई काउंटरों सिंक्रनाइज़ करने के लिए ... कुछ प्रदर्शन दंड यहां लागू कर सकते हैं, विशेष रूप से समय की सबसे बाद से यह होगा की आवश्यकता होगी पूरी तरह से अनावश्यक रहें (कोई ओवरराइड नहीं होगा) क्योंकि यह केवल एकाधिक विरासत के लिए उपयोगी है।

और निश्चित रूप से बहु-थ्रेडेड वातावरण में आप (समय की छोटी अवधि के लिए) desynchronized काउंटर (पहले वृद्धि हुई थी, लेकिन धागा दूसरे से पहले बाधित था) मैं किसी भी समस्या के बारे में अभी तक नहीं सोच सकता कारण, लेकिन यह एक गंभीर स्थिति नहीं है।

आप कक्षा में अव्यवस्था भी जोड़ते हैं, कुछ ग्राहकों को सभी के बाद संदर्भ गिनती की आवश्यकता नहीं हो सकती है (यदि वे स्टैक पर ऑब्जेक्ट बनाते हैं)।

मुझे लगता है कि यह एक अच्छा विचार नहीं है,)

+2

एकाधिक विरासत: यह समस्या तब भी होती है जब आपके पास दो आधार वर्ग होते हैं जो अपनी संदर्भ गणना लागू करते हैं। चाहे यह रेफकाउंट बेस क्लास के माध्यम से लागू किया गया हो या कोई फर्क नहीं पड़ता। मल्टी-थ्रेडेड: shared_ptr परमाणु वृद्धि/कमी है, इसलिए यह कक्षा भी हो सकती है। "कुछ ग्राहकों को संदर्भ गणना की आवश्यकता नहीं हो सकती है": यही कारण है कि आप intrusive_ptr का उपयोग नहीं करेंगे, न कि बेस क्लास क्यों नहीं है। – Jon

+1

@ जोन: मैं एकाधिक विरासत पर सहमत हूं, वास्तव में आप आधार वर्ग के बिना घुसपैठ संदर्भ गणना लागू कर सकते हैं। हालांकि मैं 2 अन्य टिप्पणियों से असहमत हूं: एमटी 'shared_ptr' पर परमाणु अर्थशास्त्र प्रदान करता है क्योंकि यह केवल एक काउंटर है, यदि आपके पास सुसंगत स्थिति में बनाए रखने के लिए कई काउंटर हैं, तो आपको स्पष्ट लॉकिंग की आवश्यकता है (कोई परमाणु ओप उपलब्ध नहीं है) और इसका मतलब है ओवरहेड ... सफेद खरगोश का पालन करें ... –

+1

'intrusive_ptr' भाग के लिए: मैं यहां आंशिक हूं, लेकिन मैंने हमेशा सोचा कि घुसपैठ दृष्टिकोण" गलत "था क्योंकि यह एक" कार्यात्मक "वर्ग और" प्रबंधन "व्यवहार दोनों के साथ बंडल हुआ था। तो यह घुसपैठ संदर्भ गणना प्रणाली पर प्रभावी रूप से एक आलोचना है। मुझे 'shared_ptr' दृष्टिकोण यहां अधिक ठोस लगता है, और तथ्य यह है कि आप 'shared_ptr' के एक सेट के लिए गलती से दो काउंटर नहीं कर सकते हैं, यह एक अच्छा बोनस है। –

4

यह तो आप intrusive_ptr कक्षाएं कि पहले से ही जोड़ सकते हैं और रिहाई को लागू के साथ उपयोग कर सकते हैं है।

+0

intrusive_ptr (मेमोरी पदचिह्न, प्रदर्शन, मनमानी कच्चे सूचक से निर्माण) का उपयोग करने के अन्य कारण हैं – Jon

+0

यह सबसे अच्छा कारण है हालांकि IMHO –

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