我发现了单个生产者 - 单个消费者的几个实现,但是没有多个生产者 - 单个消费者的实现。
Delphi是否存在“多个生产者 - 单个消费者”的无锁队列?
答案 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链),然后按顺序遍历刷新列表将项目推送到私有堆栈。
适用于单一生产者/单一消费者和多生产者/单一消费者。
但是,它不适用于多生产者/多个消费者案例。