首页 > 编程知识 正文

对象池lua,对象池模式

时间:2023-05-06 15:32:40 阅读:162984 作者:1400

对象池(object pool pattern )是一种设计模式。 Wikipedia说明: the http://www.Sina.com/usesasetofinitializedobjectskeptreadytousea ' pool 'ratherthanalllocatingandestion

使用对象池的场景具有两个特征。 此对象的初始化和实例化成本很高,并且经常使用。

在并发环境中使用对象池一般来说,在串行环境中使用对象池的意义并不大。 其本身是为了节约对象的结构初始化时间而存在的。 但是,如果在高并发环境中使用对象池,情况会稍微复杂一些。 由于目标池本身是关键资源,线程之间的并行访问必然会导致资源的访问冲突(Contention )。 那么,在同时环境下,大象池的使用方法如下。

1、object pool pattern:当线程尝试从对象池中检索对象时,它首先获取对象池的锁定,然后获取对象(指针或引用),最后解锁使用完成后,如果要将对象放回对象池,也必须先获得锁定,然后进行Reclaim,再解除锁定。

2、使用全局锁:连接池很可能是按数组或向量存储的。 那个满足了Random Access的要求。 于是,我们可以让锁对应于每个对象。 在线程获取对象之前,它首先尝试获取random的索引,然后尝试获取与该索引相对应的对象的锁定。 如果获得了锁定,则表示获得了对象。 否则,从一开始就重新获取random的索引。 此线程使用此对象后,如果直接解除锁定,则会释放对象。

两种方式在高并发环境中都存在一些不足。 第一种方法是全局锁,如果一个线程刚刚获取锁,并且调度了线程,则其他线程也将无法获取对象池中的对象。 第二种方法需要在每次获取对象失败时重新获取random access值。 此计算很花时间,而且如果对象池中的大多数对象都在使用,则此方法效率非常低。

说到33558www.Sina.com/lock-free,必须列举CAS(compare-and-swap )技术。 目前所有主流的cpu体系结构都受支持。 想了解更多无锁技术的原理和使用方法,我们建议您阅读yxdby Williams的《C++并发编程实践》一书的第7章。 笔者在学习这本书的过程中,认为使用该技术可以改善对象池。

无锁定线程安全对象池技术的优点:可以保证至少一个并发线程成功获取一个对象。

笔者采用了无锁堆栈实现的大象池。 原因有两个:

其一,堆栈界面非常符合大象池的获取。 堆栈的基本操作有两个:堆栈和外堆栈。 大象池的操作也有两个。 回收和获取。 如果把stack的堆栈看作是客体池的获得,把进入堆栈看作是客体池客体的回收,就必须把两者完美地结合起来。 因此,也可以使用lock-free stack来实现对象池。

其二,stack的实现更简单。 如果替换为lock-free的队列实现,则可以,但代码量会增加很多。

具体去我的github repo看看。 期待大家的宝贵意见。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。