如何获得boost SPSC Queue的大小?

问题描述 投票:3回答:2

我们想知道给定时间点队列中元素的数量。我们正在推送和弹出对象,我们想知道队列缓冲区中的对象数量。这有什么内置功能吗?或者其他一些方法来获得它?

http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/spsc_queue.html

c++ c++11 boost queue size
2个回答
2
投票

您无法可靠地获得尺寸,因为它会引发竞争条件。出于同样的原因,您将找不到empty()方法:当方法返回值时,它将无关紧要,因为它可能已更改。

有时无锁容器提供“unreliable_size()”方法(用于统计/日志记录)

这里的特例是SPSC假设单一生产者和消费者:

  • size_type read_available() const; 可以从spsc_queue弹出的可用元素数
  • size_type write_available() const; 获取写空间来写元素

请注意,这些仅在从相应的使用者/生产者线程中使用时有效。


0
投票

看起来我们的操作仅限于pop()和push()函数。在您的软件设计中,您必须专注于这些操作。例如,如果您是使用者,则您一次只能使用队列中的所有项目。而且你必须依赖与生产者的另一个沟通渠道(条件变量或原子变量)。

atomic<bool> producer_done(false);  // producer set this variable to tell the consumer the status
spsc_queue<Obj> theQ; // assume producers have pushed
Obj tmpObj;
while (!producer.done) {
   if (!theQ.pop(tmpObj)) {
      cerr << "did not get any item from the producer\n";
      // the producer may be too slow, your only choice is loop and wait, or other more complicated inter thread communication
      // may be sleep a little
      this_thread::sleep_for(1s);
   }
   else { // you got an item to work on
      consume(tmpObj);
   }
}
// now you know the single producer is no longer adding item to the queue
while (theQ.pop(tmpObj)) {
   consume(tmpObj);
}

这基本上是您可以在消费者部分使用spsc_queue的编码模式。

© www.soinside.com 2019 - 2024. All rights reserved.