首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可变长度的无锁队列?

可变长度的无锁队列?
EN

Stack Overflow用户
提问于 2013-08-27 08:48:10
回答 1查看 1.5K关注 0票数 1

我在C/C++中搜索了相当多的无锁队列,但是它们中的大多数必须指定最大数量的元素,包括boost::lockfree。

有人能给我一些关于可变长度、多个生产者和多个消费者无锁队列的信息吗?

EN

回答 1

Stack Overflow用户

发布于 2013-08-27 09:02:43

最大长度的主要原因是,一旦队列被创建,您就不能创建新的对象(如果不可能阻塞newmalloc或其他用于创建新对象的东西)。

我不确定有什么解决办法。如果分配锁是可以接受的,那么就不难建立一个可用内存数量有限的无锁队列。

boost::lockfree有可以用来增长队列的reserve(n)reserve_unsafe(n)

编辑回复评论:

是的,当两个生产者同时尝试添加新元素时,真正的问题就开始了,因为在某种程度上,内存分配将被阻塞,直到“领先”线程完成其分配。在某些情况下,这当然是可以接受的,但一般来说,使用无锁队列的原因是为了避免锁,而在newmalloc中设置一个锁仍然不是一个锁。

如果只在相对较少的时间内发生这种情况,这可能不是什么大问题(取决于用例)。但如果这种情况经常发生,那将是个问题。

即使只有一个生产者,也不能保证其他线程不会在某个地方调用mallocnew,从而在“向队列中添加更多内容”中造成“等待”。

我认为唯一真正的解决方案是创建一个固定大小的队列,其大小足以处理任何可能的工作负载。如果队列本身包含(智能)指针/对象引用,那么在实际存储在队列中的对象之外,可能不会占用太多的内存。毕竟,如果要存储1000个元素,那么无论队列是动态的还是固定大小的,都需要至少1000个值得存储的元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18460949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档