快速c++单生产者单消费者实现

Fast C++ single producer single consumer implementation

本文关键字:实现 消费者 生产者 快速 c++      更新时间:2023-10-16

我正在寻找一个单生产者,单消费者FIFO实现,它将比正常的lock-write-unlock-signal/waitForSignal-lock-read-unlock的东西执行得更快。我正在寻找用C或c++编写的大多数POSIX操作系统支持的东西(特定于x86就可以)。

我不希望传递任何大于指针的东西。

我不一定附属于无锁的想法,但我确实想要一些快速和正确的东西。我读到的一篇关于这个主题的论文提到了一种双队列方法,看起来很有趣,但从那以后我就没能找到更多关于它的信息。

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

另一个选择可能涉及使用POSIX消息队列,但这似乎是相当慢的线程<-->线程通信;这是真的吗?

C中是否有单消费者单生产者无锁队列实现?似乎是相关的,但公认的答案确实不是现有库的枚举,而是"过早优化是不好的"。

你会想看看英特尔的线程构建块。它们基于x86的用户模式原子操作和pthreads或Win32线程提供的原语构建,并提供快速、高效的模板化数据结构。并发队列是众多队列之一。

除了这里的其他答案(以及这个高度相关的问题)之外,我将借此机会无耻地介绍一下我自己的超快速c++实现,一个单消费者单生产者无等待队列。:

  • 使用c++ 11移动语义
  • 根据需要增长(但只有当你想要它时)
  • 对元素进行无锁内存管理(使用预分配的连续块)
  • 是独立的(两个头文件加上一个许可证和自述文件)
  • 在MSVC2010+, Intel ICC 13和GCC 4.7.2下编译(并且应该在任何c++ 11完全兼容的编译器下工作)

它可以在GitHub上使用简化的BSD许可证(请随意分叉!)。

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

今晚无意中发现了这个:CDS(并发数据结构)。

CDS (Concurrent Data Structures)是一个c++模板库,包含无锁和细粒度算法。它包含一个并发数据结构的集合:队列、映射、危险指针回收模式,-和许多其他的

我必须说我只是稍微过去了/让它建立/阶段(它不像我喜欢的那样直接),但是……您可能有兴趣亲自看一看

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

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

你需要一个单链表供生产者添加(预添加)。消费者有一个本地队列,当它耗尽时,它会抓取整个生产者列表并反转它,创建一个新的本地队列。