我们想知道给定时间点队列中元素的数量。 我们正在推送和弹出对象,我们想知道队列缓冲区中的对象数量。 这有什么内置功能吗? 或者其他一些方法来获得它?
http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/spsc_queue.html
答案 0 :(得分:2)
您无法可靠地获得尺寸,因为它会引发竞争条件。出于同样的原因,您将找不到empty()
方法:当方法返回值时,它将无关紧要,因为它可能已更改。
有时,无锁容器提供“unreliable_size()”方法(用于统计/记录)
这里的特例是SPSC假设单一生产者和消费者:
size_type read_available() const;
可从spsc_queue
size_type write_available() const;
获取写空间以写入元素
请注意,从相应的消费者/生产者线程使用时,这些仅有效。
答案 1 :(得分: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一起使用的编码模式。