diff --git a/paddle/fluid/framework/reader.cc b/paddle/fluid/framework/reader.cc index 9cdce11d375623f42aac6324a161140b5686efb5..bd915ab8bbe7fbaf5e6399bd0e7e59a137358868 100644 --- a/paddle/fluid/framework/reader.cc +++ b/paddle/fluid/framework/reader.cc @@ -120,11 +120,13 @@ void DoubleBufferReader::ReadNext(std::vector* out) { } out->clear(); - out->resize(buffer_[read_pos_].size()); + out->reserve(buffer_[read_pos_].size()); // TODO(fengjiayi): This copy shall be reduced. for (size_t i = 0; i < buffer_[read_pos_].size(); ++i) { - TensorCopy(buffer_[read_pos_][i], platform::CPUPlace(), &out[i]); - out[i].set_lod(buffer_[read_pos_][i].lod()); + LoDTensor dst; + TensorCopy(buffer_[read_pos_][i], platform::CPUPlace(), &dst); + dst.set_lod(buffer_[read_pos_][i].lod()); + out->push_back(dst); } ++read_pos_; @@ -134,13 +136,13 @@ void DoubleBufferReader::ReadNext(std::vector* out) { buffer_not_full_.notify_all(); } -bool DoubleBufferReader::HasNext() { +bool DoubleBufferReader::HasNext() const { return reader_->HasNext() || !buffer_.empty(); } void DoubleBufferReader::ProducerThreadFunc() { while (reader_->HasNext()) { - std::unique_lock lck(mtx); + std::unique_lock lck(mtx_); while (((write_pos_ + 1) % kDoubleBufferSize) == read_pos_) { buffer_not_full_.wait(lck); } diff --git a/paddle/fluid/framework/reader.h b/paddle/fluid/framework/reader.h index 917412ce9b2bd74c49989f9d62b545a24c935889..f237dd4f3cdae2d4ebdae800900d9856ac890ca8 100644 --- a/paddle/fluid/framework/reader.h +++ b/paddle/fluid/framework/reader.h @@ -140,7 +140,7 @@ class BatchReader : public DecoratedReader { class DoubleBufferReader : public DecoratedReader { public: - DoubleBufferReader(ReaderBase* reader) + explicit DoubleBufferReader(ReaderBase* reader) : DecoratedReader(reader), buffer_(kDoubleBufferSize) { framework::Async(std::bind(&DoubleBufferReader::ProducerThreadFunc, this)); }