前言
工作中经常会用到各种池,因此写几篇随笔学习并记录一下,最后附有实现代码。另见:线程池学习、连接池学习
概念
为了避免大量创建(构造)对象、销毁(析构)对象带的性能开销
设计
-
对象队列
- 初始化时,指定队列长度
- 出队、入队操作需要加锁保护
- 对象的构造
- 在初始化对象池时构造好
- 对象并不是一开始全部构造好,而是在获取对象的过程中构造(构造之后便保存在队列中供使用)
-
获取对象
- 提供接口
-
归还对象
- 提供接口,显示归还
- 利用c++ RAII特性(即智能指针析构时,调用归还操作),隐式归还
-
对象管理器
- 负责构造对象与销毁对象
- 管理每个对象的状态
-
获取状态接口
- 提供接口,用户可以获取对象池的各种状态信息
注意事项
- 对象池的更新
- 对象构造时可能需要特定的参数,运行时参数发生改变从而需要更新对象池时,需要 用户 保证在更新过程中访问对象操作的线程安全性,下面是一种方案(更新整个对象池实例):
- 用户 使用智能指针持有对象池实例,并且使用读写锁保护其访问操作
- 使用智能指针可以在更新操作发生后提供对原对象池实例的线程安全访问
- 使用智能指针可以发生更新操作(加写锁,阻塞)时只执行智能指针的赋值
- 用户 根据需要构造一个新的对象池实例,初始化成功后,加写锁替换原对象池实例
- 用户 使用智能指针持有对象池实例,并且使用读写锁保护其访问操作
- 对象构造时可能需要特定的参数,运行时参数发生改变从而需要更新对象池时,需要 用户 保证在更新过程中访问对象操作的线程安全性,下面是一种方案(更新整个对象池实例):