YAGE  v0.3.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 /* ----------------------------------------------------------------------------
2  * syncqueue.h
3  *
4  * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com>
5  * MIT License, see LICENSE file for more details.
6  * ----------------------------------------------------------------------------
7  */
8 
9 #ifndef YAGE_UTIL_SYNCQUEUE_H
10 #define YAGE_UTIL_SYNCQUEUE_H
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
88 
89 #endif
SyncQueue()=default
SyncQueue & operator=(const SyncQueue &)=delete
T pop()
Definition: syncqueue.h:41
std::condition_variable cond_
Definition: syncqueue.h:35
std::mutex mutex_
Definition: syncqueue.h:34
void push(const T &item)
Definition: syncqueue.h:68
std::queue< T > queue_
Definition: syncqueue.h:33
Definition: syncqueue.h:20