无锁队列中的内存管理

lhu*_*ous 6 c++ lock-free

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

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

queue.Add( new WorkUnit(...) );
Run Code Online (Sandbox Code Playgroud)

消费者看起来像:

WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;
Run Code Online (Sandbox Code Playgroud)

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

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

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

还有其他我们可以探索的选择吗?我们试图避免实现无锁内存池,但我们可能采取这种方式.

谢谢.

Sta*_*tas 4

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

阅读这篇详细描述此类算法的精彩文章。

  • 正如 Herb Sutter 的后续文章清楚地表明的那样,那篇文章有太多并发错误,甚至一点都不好笑;http://drdobbs.com/cpp/210600279 (3认同)