博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
翻转队列的实现
阅读量:5219 次
发布时间:2019-06-14

本文共 1310 字,大约阅读时间需要 4 分钟。

        在多线程中,经常会出现这样一种模式,A线程向队列L中push元素,B线程从队列L中pop元素,为了线程安全,必须在A push的时候加锁,然后在B pop的时候也加锁,这是一个典型的生产者消费者模式,这样显然会降低程序的效率。那么怎样来优化这种情景呢?

        我们可以使用翻转队列(又称交换队列)来提高这个模型的效率,设计思想是使用2个队列L1,L2,A还是继续向L1中push元素,但是B从L2中pop元素,然后当L2为空的时候,交换L1和L2,这样,A push的时候还是需要加锁,但是B pop的时候就不用加锁,只需要在交换L1和L2的时候加锁,真正产生冲突只有在交换的时候。这样就极大的减少锁互斥的几率,优化了模型的效率。

        代码如下(加锁的代码为伪代码),使用模板实现:        

template
class SwappingList{public: size_t Add(_OBJ & obj ) { ResGuard
lock(m_frontMutex); m_frontList->push_back(obj); return m_frontList->size(); } bool Get(_OBJ & obj ) { if ( m_backList->empty() ) { Swap(); } if ( m_backList->empty() ) { return false; } obj = m_backList->front(); m_backList->pop_front(); return true; } void Swap() { ResGuard
lock(m_frontMutex); PRODUCT_LIST * p = m_backList; m_backList = m_frontList; m_frontList = p; } SwappingList() { m_frontList = new PRODUCT_LIST; m_backList = new PRODUCT_LIST; } virtual ~SwappingList() { if ( m_frontList ) { delete m_frontList; m_frontList = 0; } if ( m_backList ) { delete m_backList; m_backList = 0; } }protected: typedef std::list<_OBJ> PRODUCT_LIST; PRODUCT_LIST* m_frontList; PRODUCT_LIST* m_backList; Mutex m_frontMutex;};

 

转载于:https://www.cnblogs.com/james1207/p/3310486.html

你可能感兴趣的文章
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
Python-Mac 安装 PyQt4
查看>>
P2571 [SCOI2010]传送带
查看>>
实验2-2
查看>>
String,StringBuffer与StringBuilder的区别?? .
查看>>
JavaScript(三) 数据类型
查看>>
移动端rem布局屏幕适配插件(放js中便可使用)
查看>>
Docker
查看>>
bzoj2259 [Oibh]新型计算机
查看>>
对位与字节的深度认识
查看>>
C++编程基础二 16-习题4
查看>>