我已经找到了针对单个生产者-单个消费者的几种实现,但没有针对多个生产者-单个消费者的实现。
Delphi 是否存在“多个生产者-单个消费者”的无锁队列?
我已经找到了针对单个生产者-单个消费者的几种实现,但没有针对多个生产者-单个消费者的实现。
Delphi 是否存在“多个生产者-单个消费者”的无锁队列?
来自OmniThreadLibrary的无锁队列支持多个生产者。您可以将它与线程库分开使用(即您可以在任何其他框架中使用 OtlContainers 单元)。
正如 Daniele 在下面指出的那样,OmniThreadLibrary 中有两个队列。OtlContainers 中的一个支持多个生产者和多个消费者,而 OtlComm 中的“更智能”版本(它只是更简单版本的包装器)只是单个生产者/单个消费者。
文档仍然是 OmniThreadLibrary 项目的一个大问题:(。关于队列的一些信息可以在这里找到。
可能会有所帮助:互锁 SList 函数。
http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/
@Daniele Teti:
读取器必须等待所有仍然可以访问旧队列的写入器退出 Enqueue 方法。由于读取器在 Dequeue 方法中所做的第一件事是为进入 Enqueue 的新写入器提供一个新队列,因此所有引用旧队列的写入器应该不需要很长时间才能退出 Enqueue。但你是对的:它只对写入器无锁,但可能仍需要读取器线程等待某些写入器退出 Enqueue。
对于多生产者/单消费者队列/FIFO,您可以使用 SLIST 或普通的无锁 LIFO 堆栈轻松创建一个无锁。您所做的是为消费者提供第二个“私有”堆栈(为简单起见,也可以作为 SLIST 或您选择的任何其他堆栈模型来完成)。消费者从私有堆栈中弹出项目。每当私有 LIFO 耗尽时,您执行 Flush 而不是从共享并发 SLIST 弹出(获取整个 SLIST 链),然后按顺序遍历 Flushed 列表将项目推入私有堆栈。
这适用于单一生产者/单一消费者和多生产者/单一消费者。
但是,它不适用于多生产者/多消费者的情况。