嗨我试着写一个无锁列表我得到了添加部分工作它认为但从列表中提取对象的代码不起作用:(
那么这个列表不是一个正常的列表..我有接口IWorkItem
interface IWorkItem { DateTime ExecuteTime { get; } bool Cancelled { get; } void Execute(DateTime now); }
好吧,我有一个列表,我可以添加这个:P和idear是我运行Get(); 在列表上它应该循环它,直到它找到一个IWorkItem
If (item.ExecuteTime < DateTime.Now)
并将其从列表中删除并返回..我已经在我的双核cpu上运行了多个线程的测试,看起来Add工作到目前为止从未失败但是Get函数丢失了一些工作项,其中我没有想法什么是错的.. ...
ps如果我得到这个工作任何人都可以免费使用代码:)你有什么办法,但我不明白它的错误点:P
代码在这里http://www.easy-share.com/1903474734/LinkedList.zip,如果你试图运行它,你会发现它有时会无法获得尽可能多的工作项列表...
编辑:我有一个无锁列表工作它比使用锁(obj)语句更快,但我有一个锁定对象使用Interlocked仍然超出无锁列表,即时尝试制作一个无锁arraylist和se如果我当我完成后,在这里得到相同的结果上传结果..
问题是你的算法:考虑这一系列事件:
线程1调用list.Add(workItem1)
,完全完成.
状态是:
first=workItem1, workItem1.next = null
然后线程1调用list.Add(workItem2)
并在第二个之前到达现场Replace
(你有评论"// let try").
状态是:
first=workItem1, workItem1.next = null, nextItem=workItem1
此时线程2接管并调用list.Get()
.假设executeTime workItem1
现在,所以调用成功并返回workItem1
.
在此状态后:
first = null, workItem1.next = null
(在另一个线程中,nextItem
仍然是workItem1
).
现在我们回到第一个线程,它完成了Add()
by设置workItem1.next:=workItem2
.
如果我们list.Get()
现在打电话null
,即使Add()
成功完成,我们也会得到.
您应该查找一个真正的同行评审的无锁链表算法.我认为,标准之一就是这个由约翰·瓦卢瓦.有一个C++实现在这里.关于无锁优先级队列的这篇文章也可能有用.