سؤال

boost::intrusive_ptr يستوجب intrusive_ptr_add_ref و intrusive_ptr_release يعرف ب. لماذا لا يتم توفير فئة أساسية والتي سيفعل هذا؟ هناك مثال هنا: http://lists.boost.org/archives/boost/2004/06/66957.php, ، لكن الملصق يقول "لا أعتقد بالضرورة أن هذه فكرة جيدة". لما لا؟

تحديث: لا أعتقد أن حقيقة أن هذا الفصل يمكن أن يساء استخدامه مع ميراث متعدد هو سبب كاف. أي فئة مستمدة من فئات أساسية متعددة مع عدد المرجع الخاص بها سيكون لها نفس المشكلة. سواء تم تنفيذ هذه المحالات عبر فئة أساسية أو لا تحدث فرقًا.

لا أعتقد أن هناك أي مشكلة مع MultiThreading ؛ boost::shared_ptr يقدم عد المرجع الذري وهذا الفئة يمكن أيضًا.

هل كانت مفيدة؟

المحلول

يوفر Boost منشأة لذلك. يمكن تكوينه إما لإعادة تأمين مؤشرات الترابط أو الترابط غير الآمن:

#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/intrusir_ref_counter.html

نصائح أخرى

إنه حتى تتمكن من استخدام interrusion_ptr مع فئات تنفذ بالفعل إضافة وإصدار.

ستكون المشكلة مع ميراث متعددة. إذا كنت ترث من 2 كائنين ينفذان هذه القاعدة ، فعندئذٍ لديك عدادان لكائنك المفرد ... وقد يتسبب ذلك في الفوضى.

وبالتالي ستحتاج إلى عمل ptr_add و ptr_release الأساليب الظاهرية ، بحيث يجوز للفئة المشتقة تنفيذ تجاوز لمزامنة العدادات المتعددة بشكل صحيح ... لميراث متعددة بعد كل شيء.

وبالطبع في بيئات متعددة الخيوط ، يمكن أن يكون لديك (لفترات قصيرة من الزمن) عدادات متزامنة (تم زيادة الأولى ، ولكن تم مقاطعة الخيط قبل الثانية) لا يمكنني التفكير بعد في أي مشكلة قد تسببها ، ولكنها كانت كذلك. ليس وضع عاقل.

يمكنك أيضًا إضافة فوضى إلى الفصل ، قد لا يحتاج بعض العملاء إلى حساب مرجعية بعد كل شيء (إذا قاموا بإنشاء الكائن على المكدس).

أعتقد أنها ليست فكرة جيدة ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top