引用计数基类—_Ref_count_base(STL源码)

//  _MT_INCR 和 _MT_DECR是宏,对应的API函数为InterlockedIncrement/InterlockedDecrement,功能为对变量加一或减一,特点是线程安全,即它们在多线程下能保证执行结果正确。

// CLASS _Ref_count_base	引用计数辅助基类(增加、减少引用计数用上述宏实现,而不是单纯的++,--)
class _Ref_count_base
{	// common code for reference counting	引用计数通用代码
private:
	virtual void _Destroy() = 0;			// 销毁托管资源(后续派生类的成员指针变量)
	virtual void _Delete_this() = 0;		// 销毁自身(delete this;)

private:
	_Atomic_counter_t _Uses;	// 原子计数器(Uses),其实就是uint_32
	_Atomic_counter_t _Weaks;	// 弱引用计数

protected:
	_Ref_count_base()
	{	// construct
		_Init_atomic_counter(_Uses, 1);		// 将_Uses、_Weaks初始化为1,非原子初始化计数器
		_Init_atomic_counter(_Weaks, 1);
	}

public:
	virtual ~_Ref_count_base() _NOEXCEPT
	{	// ensure that derived classes can be destroyed properly	确保派生类可以正确销毁
	}
	// 如果不为零,则增加使用计数_Uses;如果成功,则返回true
	bool _Incref_nz()
	{	// increment use count if not zero, return true if successful	
		for (;;)
		{	// loop until state is known
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_CEE_PURE)
			_Atomic_integral_t _Count =
				static_cast<volatile _Atomic_counter_t&>(_Uses);//volatile申明指令不会被优化而省略

			if (_Count == 0)
				return (false);
			//InterlockedCompareExchange是把第1参数 与 第3参数 比较,如果相等,则用 第2参数 与 第1参数 交换;返回子为_Uses的初值
			if (static_cast<_Atomic_integral_t>(_InterlockedCompareExchange(
				reinterpret_cast<volatile long *>(&_Uses),
				_Count + 1, _Count)) == _Count)
				return (true);

#else /* defined(_M_IX86) || defined(_M_X64) || defined(_M_CEE_PURE) */
			_Atomic_integral_t _Count =
				_Load_atomic_counter(_Uses);

			if (_Count == 0)
				return (false);

			if (_Compare_increment_atomic_counter(_Uses, _Count))
				return (true);
#endif
		}
	}
	// Get _Uses值
	unsigned int _Get_uses() const
	{	// return use count
		return (_Get_atomic_count(_Uses));
	}
	// 递增引用计数_Uses
	void _Incref()
	{	// increment use count
		_MT_INCR(_Mtx, _Uses);// 实现数的原子性加
	}
	// 递增弱引用计数_Weaks
	void _Incwref()
	{	// increment weak reference count	
		_MT_INCR(_Mtx, _Weaks);
	}
	// 减少引用计数_Uses
	void _Decref()
	{	// decrement use count
		if (_MT_DECR(_Mtx, _Uses) == 0)// 实现数的原子性减
		{	// destroy managed resource, decrement weak reference count		销毁托管资源,减少弱引用计数
			_Destroy();
			_Decwref();
		}
	}
	// 减少弱引用计数_Weaks
	void _Decwref()
	{	// decrement weak reference count
		if (_MT_DECR(_Mtx, _Weaks) == 0)	// 当弱引用计数为0是,释放对象
			_Delete_this();
	}
	// Get _Uses值
	long _Use_count() const
	{	// return use count
		return (_Get_uses());
	}
	// 判断引用计数_Uses是否为0
	bool _Expired() const
	{	// return true if _Uses == 0
		return (_Get_uses() == 0);
	}

	virtual void *_Get_deleter(const _XSTD2 type_info&) const
	{	// return address of deleter object 返回删除对象的地址
		return (0);
	}
};
// 其所有的派生类都会再定义一个同 智能指针基类_Ptr_base中的存储元素数据 一样的成员变量_Ty *_Ptr,共同指向数据单元的内存地址,用于管理内存。当引用计数变为0时释放该内存(调用_Destroy())。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值