我在C/C++中搜索了相当多的无锁队列,但是它们中的大多数必须指定最大数量的元素,包括boost::lockfree。
有人能给我一些关于可变长度、多个生产者和多个消费者无锁队列的信息吗?
发布于 2013-08-27 09:02:43
最大长度的主要原因是,一旦队列被创建,您就不能创建新的对象(如果不可能阻塞new
或malloc
或其他用于创建新对象的东西)。
我不确定有什么解决办法。如果分配锁是可以接受的,那么就不难建立一个可用内存数量有限的无锁队列。
boost::lockfree
有可以用来增长队列的reserve(n)
和reserve_unsafe(n)
。
编辑回复评论:
是的,当两个生产者同时尝试添加新元素时,真正的问题就开始了,因为在某种程度上,内存分配将被阻塞,直到“领先”线程完成其分配。在某些情况下,这当然是可以接受的,但一般来说,使用无锁队列的原因是为了避免锁,而在new
或malloc
中设置一个锁仍然不是一个锁。
如果只在相对较少的时间内发生这种情况,这可能不是什么大问题(取决于用例)。但如果这种情况经常发生,那将是个问题。
即使只有一个生产者,也不能保证其他线程不会在某个地方调用malloc
或new
,从而在“向队列中添加更多内容”中造成“等待”。
我认为唯一真正的解决方案是创建一个固定大小的队列,其大小足以处理任何可能的工作负载。如果队列本身包含(智能)指针/对象引用,那么在实际存储在队列中的对象之外,可能不会占用太多的内存。毕竟,如果要存储1000个元素,那么无论队列是动态的还是固定大小的,都需要至少1000个值得存储的元素。
https://stackoverflow.com/questions/18460949
复制相似问题