1

我一直在用谷歌搜索 C/C++ 中的无锁队列。但其中大多数必须指定最大元素数,包括 boost::lockfree。

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

4

1 回答 1

2

最大长度的主要原因是,一旦创建了队列,就无法创建新对象(没有潜在的阻塞newmalloc用于创建新对象的任何东西)。

我不确定是否有任何解决方案。如果分配锁是可以接受的,那么创建一个受可用内存量限制的无锁队列就不难了。

boost::lockfree确实有reserve(n),并且reserve_unsafe(n)可以用来增加队列。

根据评论进行编辑:

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

如果它仅以相对罕见的间隔发生,则可能没什么大不了的(取决于用例)。但如果它经常发生,那将是一个问题。

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

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

于 2013-08-27T09:02:43.750 回答