有没有多读多写的无锁队列(FIFO)算法

narwal 2011-09-08 12:30:55
最近研究无锁算法,看得最多的是ms-queue,请问有没有multi reader multi writer lock-free ringbuf的算法。
相当于一个数值,有多个读写者,要求无锁、不阻塞的访问此数值(出队或入队)。
谢谢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
...全文
657 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfasri 2011-10-10
  • 打赏
  • 举报
回复
MS-Queue改用双缓冲的模式, 会更节省CAS带来的负面影响, CAS的调用可以降低很多.
xmx2009 2011-10-10
  • 打赏
  • 举报
回复
学习了
gbb21 2011-09-19
  • 打赏
  • 举报
回复
微软Intel的无锁队列http://msdn.microsoft.com/en-us/library/dd504906.aspx#queue
showjim 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 narwal 的回复:]
总体思想是尝试-监测改变-重做

但是这方面的算法很少啊,看的最多的是 Michael-Scott 非阻塞队列算法,其他很多算法都是在他们的算法基础上改进,待我找时间研究研究做个分析总结

一个很关键的硬件限制是现在的原子操作只能对一个量操作,这也是这种算法很难实现的原因,也许将来硬件支持多个量的原子操作,这样就会好办的多[/Quote]
所谓的非阻塞也并不是不阻塞,不过是基于条件的阻塞,不同于普通的强制阻塞。非阻塞靠的是指令顺序的设计,不依赖原子操作。
非阻塞算法很少是有原因的,一是算法适用的局限性,二是复杂一点的实现代价一般都相对较高。非阻塞算法一般只适用于临界固定且非常小的情况,因为一旦碰上阻塞同时发生主导线程切换的情况就会产生CPU空转时间片的悲剧。
我主要写C#程序,实测中我那段获取唯一标识的程序最佳性能(while失败)只比Interlocked高不到40%,而用Interlocked改造成的自旋锁的代价也不到它的两倍。
我很难相信有一个通用锁的指令序列的代价会更小,一个锁的实现相对于Interlocked都觉得太大,我就更不相信应用到数据结构中代价会有多小。
narwal 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sbwwkmyd 的回复:]

也就是建立一种可尝试机制,尝试到成功为止
[/Quote]
总体思想是尝试-监测改变-重做

但是这方面的算法很少啊,看的最多的是 Michael-Scott 非阻塞队列算法,其他很多算法都是在他们的算法基础上改进,待我找时间研究研究做个分析总结

一个很关键的硬件限制是现在的原子操作只能对一个量操作,这也是这种算法很难实现的原因,也许将来硬件支持多个量的原子操作,这样就会好办的多
jc8futao 2011-09-16
  • 打赏
  • 举报
回复
ReentrantReadWriteLock???
fairywell 2011-09-15
  • 打赏
  • 举报
回复
mark
showjim 2011-09-15
  • 打赏
  • 举报
回复
也就是建立一种可尝试机制,尝试到成功为止
showjim 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 narwal 的回复:]
“就不存在所谓的这种无锁算法”
--------------请看
《Java 理论与实践: 非阻塞算法简介》
http://www.ibm.com/developerworks/cn/java/j-jtp04186/
《用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构》
http://www.ibm.com/developerworks/cn/aix/libr……
[/Quote]
写C++的唯一标识的时候用过类似的方法
#pragma once
#include "pub.sys.h"

namespace showjim { namespace sys { namespace common
{
template<typename valueType>
class identity
{
private:
valueType value;
public:
identity(valueType value = 0) : value(value)
{
}

valueType next()
{
valueType newValue = value++;
while(++newValue != value) newValue = value++;
return newValue;
}

const static identity defaultIdentity;
};
}}}
narwal 2011-09-15
  • 打赏
  • 举报
回复
“就不存在所谓的这种无锁算法”
--------------请看
《Java 理论与实践: 非阻塞算法简介》
http://www.ibm.com/developerworks/cn/java/j-jtp04186/
《用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构》
http://www.ibm.com/developerworks/cn/aix/library/au-multithreaded_structures2/
孤独小剑 2011-09-11
  • 打赏
  • 举报
回复
楼主想其他办法或者提高并发访问效率才是正道!
孤独小剑 2011-09-11
  • 打赏
  • 举报
回复
就不存在所谓的这种无锁算法,楼主概念上……
加锁就是为了并发访问时防止意外发生,不加锁如何同步?
icessl 2011-09-11
  • 打赏
  • 举报
回复
楼主,多个进程/线程共享一个对象,要对之实施"写"操作,必须要加锁,这是操作系统的基本概念.不要白费心思地找什么"无锁算法"
showjim 2011-09-11
  • 打赏
  • 举报
回复
单线程的主动获取模式?
narwal 2011-09-09
  • 打赏
  • 举报
回复
求高人啊aaaaaaaaaaaaaaaaaaaaaaaaaaaa
narwal 2011-09-09
  • 打赏
  • 举报
回复
更正下,上面的“数值”是“数组”
narwal 2011-09-09
  • 打赏
  • 举报
回复
看来只能靠自己了

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧