无锁队列中的内存管理
|
我们一直在寻找在我们的代码中使用无锁队列,以减少当前实现中单个生产者和使用者之间的锁争用。那里有很多队列实现,但是对于如何最好地管理节点的内存管理,我还不太清楚。
例如,生产者如下所示:
queue.Add( new WorkUnit(...) );
消费者看起来像:
WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;
我们目前使用内存池进行分配。您会注意到,生产者分配了内存,而使用者则删除了它。由于我们正在使用池,因此我们需要向内存池添加另一个锁以正确保护它。首先,这似乎抵消了无锁队列的性能优势。
到目前为止,我认为我们的选择是:
实现无锁内存池。
转储内存池并依赖线程安全分配器。
我们还有其他选择吗?我们正在尝试避免实现无锁内存池,但是我们可以采取这种方式。
谢谢。
没有找到相关结果
已邀请:
5 个回复
祁澈盘哼颗
剑哎
矾醒忻
和
调用看起来也很多余。英特尔的TBB和微软的PPL(包含在VS2010中)不会遇到这些问题。
珊畴炮贩号
际恃啸称桅
)。 我最近在GitHub上发布了代码。 (此外,我在我的博客上发布了有关此内容的信息。) 如果在堆栈上创建节点,将其入队,然后将其出队到堆栈上的另一个节点,则根本不需要使用指针/手动分配。此外,如果您的节点实现了用于构造和分配的移动语义,它将被自动移动,而不是复制:-)