消息关闭
    暂无新消息!

轻量级指针LightRefBase类解决不了的问题,A指向B,B指向A会导致死锁。

解决这个问题就要使用弱指针,这样就不会增加,对方的引用计数值。

使用轻量级指针,自己的类继承这个轻量级类。如:sp<class>,。


强指针/弱指针的统一实现:

将强引用弱引用计数放在实现的cpp文件中

RefBase.cpp文件中。

class RefBase::weakref_impl : public RefBase::weakref_type

{

public:

    volatile int32_t    mStrong;

    volatile int32_t    mWeak;

    RefBase* const      mBase;

    volatile int32_t    mFlags;

}


将函数接口放在RefBase.h文件这样就达到了分离的作用

class RefBase

{

public:

            void            incStrong(const void* id) const; ////强指针增加函数///添加强指针的接口

            void            decStrong(const void* id) const;

   

           

class weakref_type    //////这个类给弱指针提供了接口,,weakref_impl 去实现它,

    {

    public:

        RefBase*            refBase() const;

        void                incWeak(const void* id);

        void                decWeak(const void* id);

    }

private:

    friend class weakref_type;

    class weakref_impl;  //////////////声明类

                            RefBase(const RefBase& o);

            RefBase&        operator=(const RefBase& o);

        weakref_impl* const mRefs;             ////////////////注意这个必须有  指向实现类的指针。因为头文件是不想改变的。

}

当我们想要用这两个指针的时侯两个文件sp  wp

在StrongPointer.h头文件里定义

template<typename T>

sp<T>::sp(T* other)

: m_ptr(other)

  {

    if (other) other->incStrong(this);

  }

在Refbase里定义

template<typename T>

wp<T>::wp(T* other)

    : m_ptr(other)

{

    if (other) m_refs = other->createWeak(this);

}

所以在weakref_type里只定义了

弱指针接口。再轻量级指针里实现了Strong指针增加和减少。

lass LightRefBase

{

public:

    inline LightRefBase() : mCount(0) { }

    inline void incStrong(__attribute__((unused)) const void* id) const {

        __sync_fetch_and_add(&mCount, 1);

    }

    inline void decStrong(__attribute__((unused)) const void* id) const {

        if (__sync_fetch_and_sub(&mCount, 1) == 1) {

            delete static_cast<const T*>(this);

        }

    }

自己的类继承于refbase类使用强指针

用sp<>

弱指针

wp<>




0个评论

暂无评论!