RDMA++
Loading...
Searching...
No Matches
blocking_queue.h
1#pragma once
2
3#include <condition_variable>
4#include <mutex>
5#include <queue>
6#include <stdexcept>
7
8namespace rdmapp {
9namespace detail {
10
11template <class T> class blocking_queue {
12 std::mutex mutex_;
13 std::condition_variable cv_;
14 std::queue<T> queue_;
15 bool closed_;
16
17public:
19 void push(T const &item) {
20 std::lock_guard lock(mutex_);
21 if (closed_) {
22 throw queue_closed_error();
23 }
24 queue_.push(item);
25 cv_.notify_one();
26 }
27 T pop() {
28 std::unique_lock lock(mutex_);
29 cv_.wait(lock, [this]() { return !queue_.empty() || closed_; });
30 if (queue_.empty()) {
31 throw queue_closed_error();
32 }
33 T item = queue_.front();
34 queue_.pop();
35 return item;
36 }
37 void close() {
38 std::lock_guard lock(mutex_);
39 closed_ = true;
40 cv_.notify_all();
41 }
42};
43
44} // namespace detail
45} // namespace rdmapp
Definition blocking_queue.h:11