LIPH's C++ Codes
blocking_queue.h
Go to the documentation of this file.
1#ifndef LIPH_CONCURRENCY_BLOCKING_QUEUE_H_
2#define LIPH_CONCURRENCY_BLOCKING_QUEUE_H_
3
4#include <mutex>
5#include <queue>
6#include <shared_mutex>
7
9
10namespace liph {
11
12template <class T>
14public:
15 blocking_queue() = default;
16 ~blocking_queue() = default;
17
18 bool empty() const { return size() == 0; }
19
20 size_t size() const {
21 std::shared_lock<std::shared_mutex> rlock(mutex_);
22 return queue_.size();
23 }
24
25 void push(const T& v) {
26 std::unique_lock<std::shared_mutex> wlock(mutex_);
27 queue_.push(v);
28 }
29
30 template <class... Args>
31 void emplace(Args&&...args) {
32 std::unique_lock<std::shared_mutex> wlock(mutex_);
33 queue_.emplace(std::forward<Args>(args)...);
34 }
35
36 void pop() {
37 std::unique_lock<std::shared_mutex> wlock(mutex_);
38 if (!queue_.empty()) queue_.pop();
39 }
40
41 bool pop(T& v) {
42 std::unique_lock<std::shared_mutex> wlock(mutex_);
43 if (queue_.empty()) return false;
44 v = std::move(queue_.front());
45 queue_.pop();
46 return true;
47 }
48
49private:
50 std::queue<T> queue_;
51 mutable std::shared_mutex mutex_;
52};
53
54} // namespace liph
55
56#endif // LIPH_CONCURRENCY_BLOCKING_QUEUE_H_
Definition: blocking_queue.h:13
void emplace(Args &&...args)
Definition: blocking_queue.h:31
void pop()
Definition: blocking_queue.h:36
~blocking_queue()=default
void push(const T &v)
Definition: blocking_queue.h:25
bool pop(T &v)
Definition: blocking_queue.h:41
bool empty() const
Definition: blocking_queue.h:18
blocking_queue()=default
size_t size() const
Definition: blocking_queue.h:20
Definition: noncopyable.h:30
Definition: algorithm.h:10