快速c++单生产者单消费者实现
Fast C++ single producer single consumer implementation
我正在寻找一个单生产者,单消费者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问题,这真的不应该是一个问题。
你需要一个单链表供生产者添加(预添加)。消费者有一个本地队列,当它耗尽时,它会抓取整个生产者列表并反转它,创建一个新的本地队列。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 生产者消费者实现中的条件变量应如何初始化
- 如何实现消费者生产者,消费者可以请求新的数据
- 在c++中实现一个多生产者/消费者无锁队列
- 快速c++单生产者单消费者实现