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 
10 #pragma once
11 
12 #include <condition_variable>
13 #include <mutex>
14 #include <queue>
15 
16 namespace yage
17 {
18 
19 template <typename T>
20 class SyncQueue
21 {
22 public:
23  SyncQueue() = default;
24  SyncQueue(const SyncQueue &) = delete;
25  SyncQueue &operator=(const SyncQueue &) = delete;
26 
27  T pop();
28  void pop(T &item);
29  void push(const T &item);
30  void push(T &&item);
31 
32 private:
33  std::queue<T> queue_;
34  std::mutex mutex_;
35  std::condition_variable cond_;
36 };
37 
38 // Template definitions
39 
40 template <typename T>
42 {
43  std::unique_lock<std::mutex> mlock(mutex_);
44 
45  while (queue_.empty()) {
46  cond_.wait(mlock);
47  }
48 
49  auto item = queue_.front();
50  queue_.pop();
51  return item;
52 }
53 
54 template <typename T>
55 void SyncQueue<T>::pop(T &item)
56 {
57  std::unique_lock<std::mutex> mlock(mutex_);
58 
59  while (queue_.empty()) {
60  cond_.wait(mlock);
61  }
62 
63  item = queue_.front();
64  queue_.pop();
65 }
66 
67 template <typename T>
68 void SyncQueue<T>::push(const T &item)
69 {
70  std::unique_lock<std::mutex> mlock(mutex_);
71 
72  queue_.push(item);
73  mlock.unlock();
74  cond_.notify_one();
75 }
76 
77 template <typename T>
78 void SyncQueue<T>::push(T &&item)
79 {
80  std::unique_lock<std::mutex> mlock(mutex_);
81 
82  queue_.push(std::move(item));
83  mlock.unlock();
84  cond_.notify_one();
85 }
86 
87 } // namespace yage
SyncQueue()=default
SyncQueue & operator=(const SyncQueue &)=delete
T pop()
Definition: syncqueue.h:41
void push(const T &item)
Definition: syncqueue.h:68
Definition: syncqueue.h:20