interrusion_ptr: لماذا لا يتم توفير فئة قاعدة شائعة؟
-
04-10-2019 - |
سؤال
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
الأساليب الظاهرية ، بحيث يجوز للفئة المشتقة تنفيذ تجاوز لمزامنة العدادات المتعددة بشكل صحيح ... لميراث متعددة بعد كل شيء.
وبالطبع في بيئات متعددة الخيوط ، يمكن أن يكون لديك (لفترات قصيرة من الزمن) عدادات متزامنة (تم زيادة الأولى ، ولكن تم مقاطعة الخيط قبل الثانية) لا يمكنني التفكير بعد في أي مشكلة قد تسببها ، ولكنها كانت كذلك. ليس وضع عاقل.
يمكنك أيضًا إضافة فوضى إلى الفصل ، قد لا يحتاج بعض العملاء إلى حساب مرجعية بعد كل شيء (إذا قاموا بإنشاء الكائن على المكدس).
أعتقد أنها ليست فكرة جيدة ؛)