关于C#:可变长度的无锁队列?

a variable length lock-free queue?

本问题已经有最佳答案,请猛点这里访问。

对于C / C中的无锁队列,我已经进行了很多次搜索,但是其中大多数必须指定最大元素数量,包括boost :: lockfree。

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


最大长度的主要原因是,一旦创建队列,就无法创建新对象(不会在newmalloc中阻塞或使用任何用于创建新对象的对象)。

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

boost::lockfree确实具有可以用来增加队列的reserve(n)reserve_unsafe(n)

根据评论进行编辑:

是的,真正的问题始于两个生产者试图同时添加新元素时,因为在某种程度上,内存分配将阻塞,直到"引导"线程完成其分配为止。在某些情况下,这当然是可以接受的,但是通常,使用无锁队列的原因是避免锁,并且newmalloc内的锁仍然不是锁。

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

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

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