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

来源:百度文库 编辑:神马文学网 时间:2024/04/29 09:01:04

 

5. 进队出队操作

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

1)        出队操作

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

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

出队操作的流程图如下:

 

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

2)        进队操作

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

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

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

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

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

 

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

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

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

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

 

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

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

 

英特尔? 软件网络博客 - 中文 ? 多核分布式队列的实现:“偷”与“自私”的运用(3) 英特尔? 软件网络博客 - 中文 ? 多核分布式队列的实现:“偷”与“自私”的运用(4) 英特尔? 软件网络博客 - 中文 ? 多核编程的四层境界 英特尔? 软件网络博客 - 中文 ? 多核编程锁竞争问题及其对策 英特尔? 软件网络博客 - 中文 ? 多核编程中的条件同步模式 英特尔? 软件网络博客 - 中文 ? 利用多核多线程进行程序优化 英特尔? 软件网络博客 - 中文 ? 多核编程锁竞争问题及其对策 英特尔? 软件网络博客 - 中文 ? 程序员的十层楼(4~5层) 英特尔? 软件网络博客 - 中文 ? 程序员的十层楼(6~7层) C 语言的谜题 – 英特尔? 软件网络博客 - 中文 TBB: concurrent_queue 高性能的奥秘 – 英特尔? 软件网络博客 - 中文 Meego:为什么是QT? – 英特尔? 软件网络博客 - 中文 10G网络处理器驱动软件的设计与实现 MyBlogLog——基于博客的分布式社交网络 电脑与网络的运用 聪明的自私与愚蠢的自私 《聪明的自私与愚蠢的自私》 队列运用)迷宫最短路径问题及数组基数排序实现 英特尔多核平台编程优化大赛报告 - flyingdog的专栏 - CSDNBlog 英特尔多核平台编程优化大赛报告 - flyingdog的专栏 - CSDNBlog 视频截取和队列处理的shell实现 工作流系列之可自管理的分布式工作流引擎的设计与实现 工作流系列之可自管理的分布式工作流引擎的设计与实现 可自管理的分布式工作流引擎的设计与实现