C++ 快速C++;单生产者单消费者实现

C++ 快速C++;单生产者单消费者实现,c++,performance,producer-consumer,C++,Performance,Producer Consumer,我正在寻找一种单生产者、单消费者的FIFO实现,它的执行速度比普通的锁写解锁信号/waitForSignal锁读解锁信号快。我在寻找大多数POSIX操作系统(X86专用的)是由C或C++编写的。 我不想传递比指针更大的任何东西 我不一定喜欢无锁的想法,但我确实想要快速正确的东西。我读过一篇关于这个主题的论文,其中提到了一种似乎很有趣的双队列方法,但从那时起我就没能找到太多这方面的内容 从我到目前为止所做的研究来看,0mq(据说它的inproc://方案使用了无锁结构)看起来是最有吸引力的选择。话

我正在寻找一种单生产者、单消费者的FIFO实现,它的执行速度比普通的锁写解锁信号/waitForSignal锁读解锁信号快。我在寻找大多数POSIX操作系统(X86专用的)是由C或C++编写的。 我不想传递比指针更大的任何东西

我不一定喜欢无锁的想法,但我确实想要快速正确的东西。我读过一篇关于这个主题的论文,其中提到了一种似乎很有趣的双队列方法,但从那时起我就没能找到太多这方面的内容

从我到目前为止所做的研究来看,0mq(据说它的inproc://方案使用了无锁结构)看起来是最有吸引力的选择。话虽如此,在我走这条路之前,我想确定我没有错过任何东西

另一种选择可能涉及使用POSIX消息队列,但这似乎对于线程通信来说相当慢;这是真的吗

这似乎是相关的,但公认的答案是“过早优化是不好的”,而不是现有库的枚举。只是偶然发现了这个问题:今晚

并行数据结构(CDS)是一种无锁细粒度算法的C++模板库。它包含一组并发数据结构:队列、映射、模式等等


我必须说,我只是稍微超过了/让它构建/阶段(这并不像我希望的那么简单),但是。。。您可能有兴趣自己看看。

问题是POSIX没有包含用于联锁操作的API(据我所知)。事实上,并非所有平台都支持相同的无锁编程操作(有些使用比较和交换,有些使用加载链接存储条件)

这就是说,创建一个无锁的单消费者队列(支持多个生产者是微不足道的)唯一困难的部分是处理ABA问题,而这真的不应该是一个问题


您需要一个单独链接的列表,以便制作人添加到(prepend to)。消费者有一个本地队列,当该队列用尽时,它会获取整个生产者列表并将其反转,从而创建一个新的本地队列。Windows SList API就是一个例子。

您将想了解英特尔的线程构建块。它们基于x86的用户模式原子操作、pthreads或Win32线程提供的原语,并提供快速、高效、模板化的数据结构。并发队列是其中的一个。

< P>除了这里的其他答案(和在此)之外,我将借此机会来实现一个无耻的超级单体消费插件,C++实现单一的消费者单一生产者等待队列。它:

  • 使用C++11移动语义
  • 根据需要增长(但仅当您希望时)
  • 是否锁定元素的可用内存管理(使用预先分配的连续块)
  • 是独立的(两个标题加上许可证和自述文件)
  • 在MSVC2010+、英特尔ICC 13和GCC 4.7.2下编译(并且应在任何完全兼容C++11的编译器下工作)
它在简化的BSD许可证下(请随意使用!)


类似的队列是,它可以稍微快一点,但不支持根据需要增长(它有一个固定的大小)。

过早的优化是不好的。偶然发现,这似乎是重复的(尽管是旧的)。看起来很有趣。这本身可能不是问题(我读到的很多东西让我相信我有足够的能力来解决这个问题);同时,如果其他人已经做了某件事,我不想花时间编写/调试/维护它(而且,在一个专门研究这类事情的库中,可能比我花更多的时间来理解这类事情)。酷!另一个图书馆去看看!