我在C / C ++中搜索了一个无锁队列。但是大多数都必须指定最大数量的元素,包括boost :: lockfree。
有人能给我一些关于变长和多产品以及多个消费者无锁队列的信息吗?
答案 0 :(得分:2)
最大长度的主要原因是,一旦创建了队列,您就无法创建新对象(在new
或malloc
中没有可能阻塞或者用于创建新对象)。
我不确定是否有任何解决方案。如果分配锁是可接受的,那么制造一个受可用内存量限制的无锁队列就不会那么困难。
boost::lockfree
确实有reserve(n)
和reserve_unsafe(n)
可用于扩展队列。
根据评论进行修改:
是的,当两个生产者试图同时添加新元素时,真正的问题就开始了,因为在某种程度上,内存分配将会阻塞,直到"领先"线程已完成其分配。在某些情况下,这当然可以接受,但一般来说,使用无锁队列的原因是为了避免锁定,并且在new
或malloc
内部锁定仍然不是锁。
如果只是在相对较少的时间间隔发生,则可能没什么大不了的(取决于用例)。但如果它经常发生,那将是一个问题。
即使使用单个制作人,也无法保证其他某个帖子不会在某处调用malloc
或new
,从而导致等待"等等。在"添加更多的排队"。
我认为唯一真正的解决方案是创建一个大小足够大的固定大小队列来处理任何可能的工作负载。如果队列本身保存(智能)指针/对象的引用,则可能不会占用实际存储在队列中的对象之上和之外的太多内存。毕竟,如果要存储1000个元素,则无论队列是动态还是固定大小,都需要至少1000个元素的存储空间。