caffe数据读取的双阻塞队列说明

时间:2023-03-09 01:57:43
caffe数据读取的双阻塞队列说明

caffe的datareader类中

  class QueuePair {
public:
explicit QueuePair(int size);
~QueuePair(); BlockingQueue<T*> free_;
BlockingQueue<T*> full_; DISABLE_COPY_AND_ASSIGN(QueuePair);
};

  

这个就是双阻塞队列,先将free队列用空数据填充到最大长度,然后按照如下规则:

1,每当生产者push时,先将free队列pop,如果free为空,不可pop,那么表明full队列已满,数据已经饱和,则不可push,如果free队列可以pop,那么执行pop,填充进入实际数据,并对full队列push该数据。

2,每当消费者pop时,先将full队列pop,如果可以pop,则进行pop并消费,然后填充一个空数据push到free队列,如果full队列不可pop为空,则消费者不可pop,表明free队列已满,全为空数据。

3,核心思想是让full和free队列实际元素数量之和恒定为最大队列长度不变,通过判断free队列是否为空来判断full队列是否为满,避免直接对full队列判断是否满。

4,主要是我们可能不知道队列最大长度时,无法判断是否满时采用这种方法。