13

我已经找到了针对单个生产者-单个消费者的几种实现,但没有针对多个生产者-单个消费者的实现。

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

4

4 回答 4

5

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

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

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

于 2009-07-05T19:36:04.840 回答
3

可能会有所帮助:互锁 SList 函数

于 2009-07-05T13:24:19.540 回答
2

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

@Daniele Teti:

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

于 2009-07-05T18:47:10.570 回答
2

对于多生产者/单消费者队列/FIFO,您可以使用 SLIST 或普通的无锁 LIFO 堆栈轻松创建一个无锁。您所做的是为消费者提供第二个“私有”堆栈(为简单起见,也可以作为 SLIST 或您选择的任何其他堆栈模型来完成)。消费者从私有堆栈中弹出项目。每当私有 LIFO 耗尽时,您执行 Flush 而不是从共享并发 SLIST 弹出(获取整个 SLIST 链),然后按顺序遍历 Flushed 列表将项目推入私有堆栈。

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

但是,它不适用于多生产者/多消费者的情况。

于 2009-10-09T16:11:24.553 回答