Asio游戏网络中间件设计(二)内存管理

本文详细介绍了Asio游戏网络中间件的内存管理策略,包括目标、对象池设计、线程缓存、线程生命周期管理和线程安全的单例。强调了线程安全的重要性,采用自旋锁和线程内缓存减少竞争,并通过std::call_once实现线程安全的单例。此外,文章还提到了线程安全内存池的实现,特别指出智能指针在内存回收中的作用。
摘要由CSDN通过智能技术生成

Asio游戏网络中间件设计(二)内存管理

目标

网络层中会产生大量内存碎片,而且频繁地申请内存也影响效率,所以需要设计内存池来管理。
为了避免线程context切换时的开销,设计中尽量避免使用锁。

对象池

namespace parallel_core
{
   
	template<class T>
	class ObjectPool
	{
   
	public:
		ObjectPool();

		~ObjectPool();

		inline int countAll();

		inline int countActive();

		inline int countInactive();

		template <class ... P>
		inline T* get(P&& ... p);

		inline void release(T* element);

		inline void clear();
	private:
		std::atomic<int> _count;
		Spinlock _lock;
		std::stack<T*> _pool;
	};

	template<class T>
	inline ObjectPool<T>::ObjectPool()
	{
   
		_count.store(0);
	}

	template<class T>
	ObjectPool<T>::~ObjectPool()
	{
   
		clear();
	}

	template<class T>
	inline int ObjectPool<T>::countAll()
	{
   
		return _count.load();
	}

	template<class T>
	inline int ObjectPool<T>::countActive()
	{
   
		return _count.load() - countInactive();
	}

	template<class T>
	inline int ObjectPool<T>::countInactive()
	{
   
		return _pool.size();
	}

	template<class T>
	template <class ... P>
	inline T* ObjectPool<T>::get(P&& ... p)
	{
   
		if (LIKELY(_pool.size() == 0))
		{
   
			_count++;
			return new(std::nothrow) T(std::forward<P>(p) ...);
		}

		SpinlockHolder lk(&_lock);
		T* ret = _pool.top();
		_pool.pop();
		return ret;
	}

	template<class T>
	inline void ObjectPool<T>::
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值