Fire Core  8.0.0.alpha
GIS framework per tutti gli usi
 Tutto Classi Namespace Funzioni Variabili Ridefinizioni di tipo (typedef) Tipi enumerati (enum) Valori del tipo enumerato Friend
SyncQueue.hpp
1 // Copyright © 2015 GEOSYSTEMS SRL
2 // All Rights Reserved.
3 
4 #ifndef FIRE_THREADING_SYNCQUEUE_HPP_INCLUDED
5 #define FIRE_THREADING_SYNCQUEUE_HPP_INCLUDED
6 
7 #include <boost/thread/mutex.hpp>
8 #include <boost/thread/condition_variable.hpp>
9 
10 #include <list>
11 #include <exception>
12 
13 #include "fire/gear/threading/types.hpp"
14 
15 namespace fire {
16 namespace gear {
17 namespace threading {
18 
23 template < class T >
24 class SyncQueue {
25  public:
29  SyncQueue(): _max(0) {
30  }
31 
36  explicit SyncQueue(int const & max): _max(max) {
37  }
38 
43  void push(const T& item) {
44  // acquisisco il lock
45  auto_lock l(_mtx);
46  // verifico se posso caricare elementi
47  while (_isFullNoWait()) {
48  // attendo che ci sia spazio nel contenitore per la registrazione di item
49  _notFull.wait(l);
50  // verifico se esiste spazio per l'archiviazione (un altro thread potrebbe essere stato svegliato)
51  }
52 
53  // archivio l'elemento in testa
54  _items.push_front(item);
55  // notifico ai consumatori la presenza di elmenti da consumare
56  _notEmpty.notify_all();
57  }
58 
63  T pop() {
64  // acquisisco il lock
65  auto_lock l(_mtx);
66  // verifico se posso estrarre elementi
67  while (_isEmptyNoWait()) {
68  // attendo che ci siano elementi da leggere
69  _notEmpty.wait(l);
70  // verifico se ci sono element disponibili
71  }
72 
73  // leggo l'elemento dal fondo della lista
74  T item = _items.back();
75  _items.pop_back();
76  // notifico la presenza di slot vuoti per l'archiviazione
77  _notFull.notify_all();
78 
79  return item;
80  }
81 
86  size_t size() const {
87  auto_lock l(_mtx);
88  return _items.size();
89  }
90 
95  size_t getMax() const {
96  auto_lock l(_mtx);
97  return _max;
98  }
99 
104  bool isEmpty() {
105  auto_lock l(_mtx);
106  return _isEmptyNoWait();
107  }
108 
113  bool _isFull() {
114  auto_lock l(_mtx);
115  return _isFullNoWait();
116  }
117 
118  protected:
119  bool _isEmptyNoWait() {
120  return _items.size() == 0;
121  }
122 
123  bool _isFullNoWait() {
124  if (_max < 1)
125  return false;
126  else
127  return _items.size() >= _max;
128  }
129 
130  private:
131  std::list< T > _items;
132  size_t _max;
133 
134  mutable boost::mutex _mtx;
135  mutable boost::condition_variable _notFull;
136  mutable boost::condition_variable _notEmpty;
137 };
138 
139 } // namespace threading
140 } // namespace gear
141 } // namespace fire
142 
143 #endif
Coda sincronizzata templetizzata.
Definition: SyncQueue.hpp:24
void push(const T &item)
Aggiunge un elemento in coda.
Definition: SyncQueue.hpp:43
T pop()
Restituisce il primo elemento della coda con strategia FIFO. Se la coda risultasse vuota il thread ch...
Definition: SyncQueue.hpp:63
bool isEmpty()
Verifica se la coda risulta vuota.
Definition: SyncQueue.hpp:104
SyncQueue()
Costruttore della coda con capacità infinita.
Definition: SyncQueue.hpp:29
SyncQueue(int const &max)
Costruttore della coda con capacità limitata.
Definition: SyncQueue.hpp:36
size_t getMax() const
ritorna il numero massimo degli elementi memorizzabili.
Definition: SyncQueue.hpp:95
size_t size() const
ritorna il numero degli elementi attualmente in coda
Definition: SyncQueue.hpp:86
bool _isFull()
Verifica se la coda risulta completamente riempita sulla base del valore della proprietà max...
Definition: SyncQueue.hpp:113