我们想要知道队列在某个时间点的元素数量。
我们正在推入和弹出对象,希望知道队列缓冲区中对象的数量。
是否有内置函数可以实现这一功能?
或者有其他方法可以得到这个信息吗?
参考链接:http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/spsc_queue.html
参考链接:http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/spsc_queue.html
empty()
方法:当该方法返回值时,它将变得无关紧要,因为它可能已经改变。size_type read_available() const;
可以从spsc_queue中弹出的可用元素数量
size_type write_available() const;
获取写入元素的写入空间
看起来我们的操作仅限于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 编码模式。