代码如下,shared_ptr怎么稍作改动能做到线程安全?
请教,下面的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)
{
}
//-------------------------------------------------------------------------
...全文
相关推荐
C++11 std::shared_ptr总结与使用示例代码详解
C++11 std::shared_ptr总结与使用示例代码详解std::shared_ptr是C++11中引入的一种智能指针,主要用于自动管理资源的生命周期。
【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解
"深入理解C++中的智能指针,包括shared_ptr、unique_ptr和weak_ptr,以及它们在防止内存泄漏中的作用。"在C++编程中,智能指针是管理动态分配内存的有效工具,它们能自动释
C++11 智能指针之shared_ptr代码详解
make_shared函数会在堆上分配内存,初始化对象,并返回一个指向该对象的shared_ptr,这种方式是线程安全的,并且能够优化内存分配,因为它是将控制块和对象的存储空间分配在同一个内存块中。
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
如:```cppvoid process(shared_ptr<int> ptr) { cout << "in process use_count:" << ptr.use_count() << endl
C++ 智能指针(shared_ptr/weak_ptr)源码
C++ 智能指针(shared_ptr/weak_ptr)源码源码位置:gcc-6.1.0\gcc-6.1.0\libstdc++-v3\include\tr1这里只单列shared_ptr.h文件用


模式及实现
