Delphi是否存在无锁队列“多个生产者 - 单个消费者”?

时间:2009-07-05 11:54:06

标签: delphi data-structures lock-free

我发现了单个生产者 - 单个消费者的几个实现,但是没有多个生产者 - 单个消费者的实现。

Delphi是否存在“多个生产者 - 单个消费者”的无锁队列?

4 个答案:

答案 0 :(得分:5)

OmniThreadLibrary的无锁队列支持多个生产者。您可以在线程库中单独使用它(即您可以在任何其他框架中使用OtlContainers单元)。

正如Daniele所指出的,OmniThreadLibrary中有两个队列。 OtlContainers中的一个支持多个生产者和多个消费者,而OtlComm中的“更智能”版本(它只是更简单版本的包装)只是单个生产者/单个消费者。

文档仍然是OmniThreadLibrary项目的一个大问题:(。可以找到有关队列的一些信息here

答案 1 :(得分:3)

可能会有所帮助:Interlocked SList functions

答案 2 :(得分:2)

http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/

@Daniele Teti:

读者必须等待仍然可以访问队列的所有作者退出Enqueue方法。由于读者在Dequeue方法中所做的第一件事就是为进入Enqueue的新编写者提供一个新队列,所以对所有引用旧队列的编写者都不应该花很长时间才能退出Enqueue。但你是对的:它只对作者来说是无锁的,但可能仍然需要读者线程等待一些作者退出入队。

答案 3 :(得分:2)

对于多生产者/单用户队列/ FIFO,您可以使用SLIST或简单的无锁LIFO堆栈轻松制作一个LockFree。你所做的是为消费者提供第二个“私人”堆栈(为简单起见,你也可以将其作为SLIST或你选择的任何其他堆栈模型)。消费者将物品从私人堆栈中弹出。每当私有LIFO被耗尽时,你会执行Flush而不是弹出共享并发SLIST(抓住整个SLIST链),然后按顺序遍历刷新列表将项目推送到私有堆栈。

适用于单一生产者/单一消费者和多生产者/单一消费者。

但是,它不适用于多生产者/多个消费者案例。