实现一个lockfree 的队列
来源:互联网 发布:单片机编程课程 编辑:程序博客网 时间:2024/05/16 09:39
看梁总的题目,实现高速队列,百思不得其解。
后来看了答案,算是比葫芦画瓢实现了一个。
其实最重要的两点:
1。实现一个原子加加,用来得到一个唯一下标。
2.用一个永远不会使用的值当标记,验证该下标对应的位置是否有值。
代码如下:
// 临界锁,线程安全// 必须要有一个不会用的空值,template <class T_Key>class CQQueue_Lockfree{public:CQQueue_Lockfree(){m_lMaxQueueSize = -1;m_tpQueue = NULL;m_lBegPos = 0;m_lEndPos = 0;};~CQQueue_Lockfree(){if(m_tpQueue)delete m_tpQueue;};var_4 InitQueue(var_4 lMaxQueueSize, T_Key null){m_lMaxQueueSize = lMaxQueueSize;m_tpQueue = new T_Key[m_lMaxQueueSize];if(m_tpQueue == NULL)return -1;m_lBegPos = 0;m_lEndPos = 0;m_null = null;for( var_4 i = 0; i < lMaxQueueSize; i++ ){m_tpQueue[i] = null;}return 0;};void ResetQueue(){m_lBegPos = 0;m_lEndPos = 0;};void ClearQueue(){if(m_tpQueue){delete m_tpQueue;m_tpQueue = NULL;}m_lMaxQueueSize = -1;m_lBegPos = 0;m_lEndPos = 0;};void PushData(T_Key tKey){register var_u8 cnt =1;var_u8 pos = fetch_and_add(&m_lEndPos, cnt)%m_lMaxQueueSize;while( m_null != m_tpQueue[pos] )cp_sleep(1);m_tpQueue[pos] = tKey;};T_Key PopData(){register var_u8 cnt =1;var_u8 pos = fetch_and_add(&m_lBegPos, cnt)%m_lMaxQueueSize;T_Key*p = m_tpQueue+pos;while( m_null == *p )cp_sleep(1);T_Key ret = *p;*p = m_null;return ret;};private:var_4 m_lMaxQueueSize;T_Key* m_tpQueue;T_Key m_null;var_u4 m_lBegPos;var_u4 m_lEndPos;};
上面是我的代码,梁总的实现更高效,
首先,他认为队列足够长,并且取得足够快,所以在push时,根本不检查队头压队尾的情况。
在pop时,只检查队头-队尾的长度,小于一个阈值就不再取,由于只用于高速队列,会一直有数据被push,所以不会发生阈值以内的数据被延时。
经过测试,这种方式比用锁少了40%。
10亿次放入和读取,10线程花费200秒。
不过梁总测试说8核1.5GHz花了88秒,但在我24核
vendor_id : GenuineIntel
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz
stepping : 7
cpu MHz : 2300.469
cache size : 15360 KB
的机器上,也只跑了200秒,真是奇怪。
- 实现一个lockfree 的队列
- lockfree 的队列的实现
- 实现一个lockfree的队列——错误修改
- MemoryPool的LockFree实现
- MemoryPool的LockFree实现
- MemoryPool的LockFree实现
- CAS lockfree 循环队列
- CAS lockfree 循环队列
- lock和lockfree 之内核如何使用队列的
- 带回收功能的lockfree queue的java实现
- 基于lockfree实现的跨平台智能指针
- 一个简单的队列实现
- 一个数组队列的实现
- evpp性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试
- [LockFree之美] 使用Hazard Version实现的无锁Stack与Queue
- 用 C# 实现的一个队列源代码
- 用 C# 实现的一个队列源代码
- 一个消息队列类的实现C++
- Git忽略已经跟踪的文件
- echo要注意的问题
- 做饭记
- 用两个栈实现队列
- Java虚拟机内存设置
- 实现一个lockfree 的队列
- 小谈符合”人机工程“的设计理念
- Android之Wifi学习(1)
- Windows dos结束进程
- JDBC基础知识汇总
- maven2 入门
- 锁?不锁?如何锁? .
- 在程序中获取编译时SVN的版本号
- IOS UIKIT框架类之窗口和视图架构介绍!