代码如下,shared_ptr怎么稍作改动能做到线程安全?

shilei_312 shilei_312 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教,下面的shared_ptr怎么做到线程安全?(最好不用加锁,也不要像boost::shared_ptr那么复杂)

template <typename T> struct Deleter
{
typedef T value_type;
typedef void (*Type)(T*);

static void Delete(T* _obj_ptr)
{
delete _obj_ptr;
}
};

template<typename T, typename D = Deleter<T> >
class SharedPtr
{
public:
typedef T value_type;

SharedPtr();
SharedPtr(const SharedPtr& _ptr);
explicit SharedPtr(T* _ptr);

~SharedPtr();
SharedPtr& operator = (const SharedPtr& _ptr);

bool IsEmpty () const;
T& operator *() const;
T* operator->() const;

private:
T* holder_ptr;
long* ref_ptr;

void Release ();
void Swap(SharedPtr &_other);
};

//-------------------------------------------------------------------------
template<class T, class D>
inline bool Boi::SharedPtr<T, D>::IsEmpty() const
{
return !holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline void Boi::SharedPtr<T, D>::Swap( SharedPtr<T, D> &_other )
{
std::swap(holder_ptr, _other.holder_ptr);
std::swap(ref_ptr, _other.ref_ptr);
}
//-------------------------------------------------------------------------
template<class T, class D>
inline void Boi::SharedPtr<T, D>::Release()
{
if (holder_ptr && ref_ptr && --*ref_ptr <= 0)
{
delete ref_ptr;
D::Delete(holder_ptr);
}
holder_ptr = NULL, ref_ptr = NULL;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline T* Boi::SharedPtr<T, D>::operator->() const
{
return holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline T& Boi::SharedPtr<T, D>::operator*() const
{
return *holder_ptr;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline SharedPtr<T, D>& Boi::SharedPtr<T, D>::operator = ( const SharedPtr<T, D>& _ptr )
{
Swap(SharedPtr<T, D>(_ptr));
return *this;
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::~SharedPtr()
{
Release();
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr(T* _ptr)
: holder_ptr(_ptr)
{
if (holder_ptr)
{
ASSERT(ref_ptr = new long(1));
}
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr(const SharedPtr<T, D>& _ptr)
: ref_ptr(_ptr.ref_ptr), holder_ptr(_ptr.holder_ptr)
{
if (ref_ptr) ++(*ref_ptr);
}
//-------------------------------------------------------------------------
template<class T, class D>
inline Boi::SharedPtr<T, D>::SharedPtr()
: holder_ptr(NULL), ref_ptr(NULL)
{

}
//-------------------------------------------------------------------------
...全文

相关推荐

评论 14
收藏 已收藏
分享
返回顶部
shilei_312
模式及实现 5,529 成员 4,167 内容