【发布时间】:2011-02-11 17:44:41
【问题描述】:
我正在寻找一种方法来实现支持单个生产者和多个消费者的无锁队列数据结构。我看过 Maged Michael 和 Michael Scott (1996) 的经典方法,但他们的版本使用链表。我想要一个使用有界循环缓冲区的实现。使用原子变量的东西?
顺便说一句,我不确定为什么这些经典方法是为需要大量动态内存管理的链表设计的。在多线程程序中,所有的内存管理例程都是序列化的。将无锁方法与动态数据结构结合使用,难道我们没有打败它们的好处吗?
我正在尝试在英特尔 64 位架构上使用 pthread 库在 C/C++ 中对此进行编码。
谢谢你, 希里什
【问题讨论】:
-
有限大小的缓冲区意味着如果其中没有空白空间,生产者可能会失败。你可以接受吗?
-
另请注意,在 C++ 中,您可以将自己的分配器提供给
std::list。因为你只有一个生产者,这个分配器不需要同步。例如,它可以从预先分配的缓冲区中“分配”列表节点,并且当空间不足时,使用全局同步的malloc()分配一个新的缓冲区,类似于“真实”分配器。这意味着它只会在 1% 的调用中使用同步。 -
如果您希望优化线程的内存使用,tcmalloc 是一个很棒的库。由于它为每个线程维护内存池,它可能避免了内存例程序列化问题。
-
根据我的研究,英特尔 TBBMalloc 的可扩展性优于 Google TCMalloc。您还可以提供自己的分配器或使用英特尔 TBB cache_aligned_allocator
传递给 std::list 或 std::queue -
有一些 malloc 实现是无锁的并且大部分是无锁的,还有任意数量的线程感知 malloc 可以避免在许多情况下锁定。
标签: c++ queue atomic lock-free