Simple bounded blocking queue for graph runtime. More...
#include <chrono>
#include <condition_variable>
#include <cstddef>
#include <deque>
#include <mutex>
#include <utility>
Namespaces Index
Classes Index
Description
Simple bounded blocking queue for graph runtime.
File Listing
The file content with the documentation metadata removed is:
9#include <condition_variable>
19 explicit BlockingQueue(std::size_t capacity = 0) : capacity_(capacity) {}
21 bool push(const T& item, int timeout_ms = -1) {
22 std::unique_lock<std::mutex> lock(mu_);
27 cv_not_full_.wait(lock, [&] { return closed_ || queue_.size() < capacity_; });
28 } else if (!cv_not_full_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
29 [&] { return closed_ || queue_.size() < capacity_; })) {
32 if (closed_ || (capacity_ > 0 && queue_.size() >= capacity_))
35 queue_.push_back(item);
36 cv_not_empty_.notify_one();
40 bool push(T&& item, int timeout_ms = -1) {
41 std::unique_lock<std::mutex> lock(mu_);
46 cv_not_full_.wait(lock, [&] { return closed_ || queue_.size() < capacity_; });
47 } else if (!cv_not_full_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
48 [&] { return closed_ || queue_.size() < capacity_; })) {
51 if (closed_ || (capacity_ > 0 && queue_.size() >= capacity_))
54 queue_.push_back(std::move(item));
55 cv_not_empty_.notify_one();
60 std::lock_guard<std::mutex> lock(mu_);
63 if (capacity_ > 0 && queue_.size() >= capacity_)
65 queue_.push_back(item);
66 cv_not_empty_.notify_one();
71 std::lock_guard<std::mutex> lock(mu_);
74 if (capacity_ > 0 && queue_.size() >= capacity_)
76 queue_.push_back(std::move(item));
77 cv_not_empty_.notify_one();
81 bool pop(T& out, int timeout_ms = -1) {
82 std::unique_lock<std::mutex> lock(mu_);
84 cv_not_empty_.wait(lock, [&] { return closed_ || !queue_.empty(); });
86 cv_not_empty_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
87 [&] { return closed_ || !queue_.empty(); });
91 out = std::move(queue_.front());
93 cv_not_full_.notify_one();
98 std::lock_guard<std::mutex> lock(mu_);
100 cv_not_empty_.notify_all();
101 cv_not_full_.notify_all();
105 std::lock_guard<std::mutex> lock(mu_);
110 std::lock_guard<std::mutex> lock(mu_);
111 return queue_.size();
115 mutable std::mutex mu_;
116 std::condition_variable cv_not_empty_;
117 std::condition_variable cv_not_full_;
118 std::deque<T> queue_;
119 std::size_t capacity_ = 0;
120 bool closed_ = false;
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.1.