【问题标题】:Fast C++ single producer single consumer implementation快速 C++ 单生产者单消费者实现
【发布时间】:2011-10-02 01:06:51
【问题描述】:

我正在寻找一种单生产者、单消费者 FIFO 实现,它的执行速度比正常的 lock-write-unlock-signal / waitForSignal-lock-read-unlock 的东西要快。我正在寻找用 C 或 C++ 编写的大多数 POSIX 操作系统(特定于 x86 很好)支持的东西。

我不想传递比指针更大的东西。

我不一定喜欢无锁的想法,但我确实想要一些快速且正确的东西。我读到的一篇关于这个主题的论文提到了一种看起来很有趣的双队列方法,但从那时起我就再也找不到更多的相关信息了。

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

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

Any single-consumer single-producer lock free queue implementation in C? 似乎相关,但接受的答案实际上并没有像“过早优化不好”那样枚举现有库。

【问题讨论】:

标签: c++ performance producer-consumer


【解决方案1】:

您将需要查看英特尔的线程构建模块。它们建立在 x86 的用户模式原子操作和 pthread 或 Win32 线程提供的原语之上,并提供快速、高效、模板化的数据结构。并发队列是其中之一。

【讨论】:

  • 酷!另一个值得研究的图书馆!
【解决方案2】:

偶然发现:CDS (Concurrent Data Structures)今晚。

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

我必须说我只是略过了 /getting it to build/ 阶段(它不像我希望的那样简单)但是......你可能有兴趣自己看看。

【讨论】:

    【解决方案3】:

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

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

    您需要一个单链表供生产者添加(添加到)。消费者有一个本地队列,当它耗尽时,它会抓取整个生产者列表并将其反转,创建一个新的本地队列。 Windows SList API 就是一个例子。

    【讨论】:

    • 这本身可能不是问题(我读过的大部分内容让我相信我有足够的能力来解决它);同时,如果其他人已经做过,我不想花时间编写/调试/维护某些东西(而且,对于专门用于此类事情的库,可能会花费更多时间来理解这一点比我有的东西)。
    【解决方案4】:

    除了此处的其他答案(以及在此 highly related question 中),我将借此机会无耻地插入 my own 超快的 C++ 实现单消费者单生产者无需等待队列。它:

    • 使用 C++11 移动语义
    • 按需增长(但仅在您希望时)
    • 对元素进行无锁内存管理(使用预先分配的连续块)
    • 是独立的(两个标题加上一个许可证和自述文件)
    • 在 MSVC2010+、Intel ICC 13 和 GCC 4.7.2 下编译(并且应该在任何 C++11 完全兼容的编译器下工作)

    在简化的 BSD 许可证下它是 available on GitHub(请随意分叉!)。

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

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2017-02-24
      • 2015-04-05
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多