YAGE  v0.1.1
Yet Another Game Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
syncqueue.h
Go to the documentation of this file.
1 #ifndef YAGE_UTIL_SYNCQUEUE_H
2 #define YAGE_UTIL_SYNCQUEUE_H
3 
4 #include <condition_variable>
5 #include <mutex>
6 #include <queue>
7 
8 namespace yage
9 {
10 
11 template <typename T>
12 class SyncQueue
13 {
14 public:
15  SyncQueue() = default;
16  SyncQueue(const SyncQueue &) = delete;
17  SyncQueue &operator=(const SyncQueue &) = delete;
18 
19  T pop();
20  void pop(T &item);
21  void push(const T &item);
22  void push(T &&item);
23 
24 private:
25  std::queue<T> queue_;
26  std::mutex mutex_;
27  std::condition_variable cond_;
28 };
29 
30 // Template definitions
31 
32 template <typename T>
34 {
35  std::unique_lock<std::mutex> mlock(mutex_);
36 
37  while (queue_.empty()) {
38  cond_.wait(mlock);
39  }
40 
41  auto item = queue_.front();
42  queue_.pop();
43  return item;
44 }
45 
46 template <typename T>
47 void SyncQueue<T>::pop(T &item)
48 {
49  std::unique_lock<std::mutex> mlock(mutex_);
50 
51  while (queue_.empty()) {
52  cond_.wait(mlock);
53  }
54 
55  item = queue_.front();
56  queue_.pop();
57 }
58 
59 template <typename T>
60 void SyncQueue<T>::push(const T &item)
61 {
62  std::unique_lock<std::mutex> mlock(mutex_);
63 
64  queue_.push(item);
65  mlock.unlock();
66  cond_.notify_one();
67 }
68 
69 template <typename T>
70 void SyncQueue<T>::push(T &&item)
71 {
72  std::unique_lock<std::mutex> mlock(mutex_);
73 
74  queue_.push(std::move(item));
75  mlock.unlock();
76  cond_.notify_one();
77 }
78 
79 } // namespace yage
80 
81 #endif
SyncQueue()=default
SyncQueue & operator=(const SyncQueue &)=delete
T pop()
Definition: syncqueue.h:33
std::condition_variable cond_
Definition: syncqueue.h:27
std::mutex mutex_
Definition: syncqueue.h:26
void push(const T &item)
Definition: syncqueue.h:60
std::queue< T > queue_
Definition: syncqueue.h:25
Definition: syncqueue.h:12