多线程安全无锁消息队列
来源:互联网 发布:it程序员面试自我介绍 编辑:程序博客网 时间:2024/06/10 03:27
技术介绍:
cas 原子操作:是有cpu提供的原子操作。
<pre name="code" class="cpp">MyDeque{ Node *head; Node *tail; void enQueue(T value); T deQueue();}
入队操作
void enQueue(T value){ node * q=getNewNode(); q->next=null; q->value=T; // 通过原子操作把q加入到队列 while(1) { node *tem=tail; while(tem->next!=null) //防止其他线程已经把元素加入队列,但是没有更新tail tem=tem->next; if( CAS(&tail->next,null,q)) break; } //通过援助操作,更新tail CAS(&tail,tail,tail->next); }
出对操作
T deQueue(){ while(1) { node *q=head; if(q->next==null)//没有元素,带头结点的队列 return null; if(CAS( &head ,q,head->next)) 更新head break; } T temValue=q->value; recycle(q); //回收空间 return temValue;
}以上是队列出对入队操作,
Pseudocode from article of the above name in PODC96 (with two typos corrected), by Maged M. Michael and Michael L. Scott
关于该算法的一些优化
1.该算法的入队时候需要重新分配空间,分配空间这个开销是很大的,实际上可以不用每次入队都分配工具,可以是实现个多线程安全的freeList,用来存放可用的空间结点,每次入队了,从freeList得到一个空间,加入队列。出队时,可是把该空间加入到freeList,这样可以节省空间分配和回收的开销,同时也可以避免ABA问题。这个方法可以参考lmax disruptor.
2.关于伪共享的问题,需要cache line填充。在head,tail之间可以填充64字节的无关数据。
- 多线程安全无锁消息队列
- 多线程的无锁队列
- 多线程环境下安全的消息队列存取---利用信号量
- 多线程下面日志输出-线程安全-消息队列循环输出
- 云风的无锁消息队列
- 无锁消息队列【好文转载】
- 多线程安全CAS实现的无锁
- 多线程无锁队列的实现
- 多线程无锁算法之无锁队列的实现
- 多线程无锁算法之无锁队列的实现
- 多线程操作消息队列
- 消息队列 多线程 linux
- windows 多线程 消息队列
- 多线程消息处理队列
- windows 多线程 消息队列
- java多线程:消息队列
- 多线程消息队列 (MSMQ) 触发器
- 多线程消息队列 (MSMQ) 触发器
- JetBrains PhpStorm 7 / WebStorm 7注册码+注册机
- 一个简单的线程中断的例子
- Lucene中一些英文分析器 Analyzer
- poj 快速幂+并查集
- px、dp和sp,这些单位有什么区别?
- 多线程安全无锁消息队列
- Mybatis3中对oracle的批量插入
- 百度地图问题
- Tutorial 15 - Camera Control - Part 2
- 使用goldengate的数据泵进行Oracle-Oracle的单向复制
- phpmyadmin修改密码,导入sql文件
- s:if的用法(判断用户是否登录过了的操作)
- 遇到的问题-----------c#在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
- Entity Framework 5.0系列之自动生成Code First代码