c++ - 无锁队列中的内存管理

标签 c++ lock-free

我们一直在寻求在我们的代码中使用无锁队列,以减少当前实现中单个生产者和消费者之间的锁争用。那里有很多队列实现,但我不太清楚如何最好地管理节点的内存管理。

例如,生产者看起来是这样的:

queue.Add( new WorkUnit(...) );

消费者看起来像:

WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;

我们目前使用内存池进行分配。您会注意到生产者分配内存而消费者删除它。由于我们正在使用池,因此我们需要向内存池添加另一个锁以正确保护它。这似乎首先否定了无锁队列的性能优势。

到目前为止,我认为我们的选择是:

  • 实现无锁内存池。
  • 转储内存池并依赖线程安全分配器。

还有其他可供我们探索的选择吗?我们正在努力避免实现无锁内存池,但我们可能会选择这条路。

谢谢。

最佳答案

只有生产者才能创建对象并在不再需要时销毁它们。消费者只能使用对象并将它们标记为已使用。这才是重点。在这种情况下,您不需要共享内存。这是我所知道的高效无锁队列实现的唯一方法。

阅读this详细描述此类算法的好文章。

关于c++ - 无锁队列中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6461236/

相关文章:

c# - 为什么不推荐使用堆来排序LinkedList?

c# - 尝试编写无锁单链表,删除麻烦

c++ - C++ 无锁队列实现中的虚假下溢

multithreading - CAS 碰撞的 CPU 内部特性是什么?

c++ - 拆分引用计数如何在无锁堆栈中工作?

c++ - 在具有预分配 block 的自定义 STL 分配器中重新绑定(bind)

c++ - bit hack vs 循环内的条件语句

c++ - 在 pimpl 习语中无效使用不完整类型错误

c++ -/boost/lockfree/queue.hpp: 错误: 静态断言失败: (boost::has_trivial_destructor<T>::value)

c++ - 带有预分配缓冲区的循环缓冲区?