Vowpal Wabbit
queue.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <queue>
4 
5 // Mutex and CV cannot be used in managed C++, tell the compiler that this is unmanaged even if included in a managed
6 // project.
7 #ifdef _M_CEE
8 #pragma managed(push, off)
9 #undef _M_CEE
10 #include <mutex>
11 #include <condition_variable>
12 #define _M_CEE 001
13 #pragma managed(pop)
14 #else
15 #include <mutex>
16 #include <condition_variable>
17 #endif
18 
19 namespace VW
20 {
21 template <typename T>
22 class ptr_queue
23 {
24  public:
25  ptr_queue(size_t max_size) : max_size(max_size) {}
26 
27  T* pop()
28  {
29  std::unique_lock<std::mutex> lock(mut);
30  while (!done && object_queue.size() == 0)
31  {
32  is_not_empty.wait(lock);
33  }
34 
35  if (done && object_queue.size() == 0)
36  {
37  return nullptr;
38  }
39 
40  auto item = object_queue.front();
41  object_queue.pop();
42 
43  lock.unlock();
44  is_not_full.notify_all();
45  return item;
46  }
47 
48  void push(T* item)
49  {
50  std::unique_lock<std::mutex> lock(mut);
51  while (object_queue.size() == max_size)
52  {
53  is_not_full.wait(lock);
54  }
55 
56  object_queue.push(item);
57 
58  lock.unlock();
59  is_not_empty.notify_all();
60  }
61 
62  void set_done()
63  {
64  done = true;
65 
66  is_not_empty.notify_all();
67  is_not_full.notify_all();
68  }
69 
70  size_t size() const { return object_queue.size(); }
71 
72  private:
73  size_t max_size;
74  std::queue<T*> object_queue;
75  std::mutex mut;
76 
77  bool done = false;
78 
79  std::condition_variable is_not_full;
80  std::condition_variable is_not_empty;
81 };
82 } // namespace VW
void push(T *item)
Definition: queue.h:48
ptr_queue(size_t max_size)
Definition: queue.h:25
bool done
Definition: queue.h:77
std::condition_variable is_not_full
Definition: queue.h:79
std::queue< T * > object_queue
Definition: queue.h:74
std::mutex mut
Definition: queue.h:75
size_t size() const
Definition: queue.h:70
Definition: autolink.cc:11
void set_done()
Definition: queue.h:62
size_t max_size
Definition: queue.h:73
T * pop()
Definition: queue.h:27
std::condition_variable is_not_empty
Definition: queue.h:80