【问题标题】:a variable length lock-free queue? [duplicate]可变长度无锁队列? [复制]
【发布时间】:2013-08-27 08:48:10
【问题描述】:

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

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

【问题讨论】:

标签: c++ c queue lock-free


【解决方案1】:

最大长度的主要原因是一旦创建了队列,就不能创建新对象(没有可能阻塞newmalloc 或用于创建新对象的任何内容)。

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

boost::lockfree 确实有 reserve(n)reserve_unsafe(n) 可用于增加队列。

编辑以响应 cmets:

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

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

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

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

【讨论】:

  • 实际上我发现了一个动态大小的无锁,但它是单生产者,单消费者。link我猜当元素数量超出时队列将创建新节点并调整自身大小高层。
  • 我再次查看 boost 文档。它说“从操作系统分配内存不是无锁的。这使得实现真正的动态大小的非阻塞数据结构成为不可能。”动态大小的队列可以自行调整大小,因为它是单一生产者?
  • @user2720721:请参阅答案中的编辑。
  • 非常感谢你,我知道我应该做什么了。
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2017-10-18
  • 2022-10-18
相关资源
最近更新 更多