英特尔? 软件网络博客 - 中文 ? 多核分布式队列的实现:“偷”与“自私”的运用(3)

来源:百度文库 编辑:神马文学网 时间:2024/05/14 14:13:29

 

5. 进队出队操作

分布式队列的进队出队操作根据不同应用类型具有不同的操作策略,但是不论何种类型的操作,其基本思想必须以本地队列操作最大化作为前提条件。下面给出分布式队列中常用的进队出队操作类型。

1)        出队操作

出队操作比较简单,通常都是先从本地队列中获取数据,如果本地队列为空,那么再从共享队列池中获取数据。

由于先从本地队列中获取数据,因此有助于实现本地队列操作的最大化。

出队操作的流程图如下:

 

图2:分布式队列的出队操作流程图

2)        进队操作

进队操作相比于出队操作要复杂一些,常用的操作策略有以下两种:

策略1:先判断本地队列是否为空,如果为空则将数据放入本地队列中;然后判断共享队列池中是否满,如果满则将数据放入本地队列中,否则放入共享队列中。

在这种策略的进队操作中,首先考虑的是本地队列的操作问题,本地队列至少要有一个数据,然后考虑的问题是负载平衡问题,共享队列池中的数据主要用于各线程间数据的负载均衡。共享队列池的大小必须做出限制,否则数据全部都进到共享队列池中去了,本地队列未得到有效使用。

共享队列池到底设定多大,才能使得本地队列操作最大化与负载平衡问题之间取得一个好的均衡,是在实际情况中需要考虑的问题,最好通过测试程序性能去获取一个合适的值。

进队操作策略1的操作流程图如下:

 

图3:分布式队列的进队操作策略1的流程图

策略2:当有多个数据需要进队时,先放入一些数据到本地队列中,然后剩下的数据再放入共享队列池中,如果队列池满的话,则仍然放入本地队列中。

本策略中,通常是进队的线程马上自己要从队列中获取数据,因此要先放入一些数据到自己的本地队列中,保证下次从队列中取数据一定是从本地队列中获取,可以大大提高本地化队列操作的频率,有效降低共享队列池的操作,大大减少了同步操作。

进队操作策略2的操作流程图如下:

 

图4:分布式队列的进队操作策略2的流程图

有了进队操作和出队操作的详细流程后,实现分布式队列的具体代码就容易多了。下面就来实现CDistributedQueue类的各个操作的详细源代码。