7.6. La biblioteca de hilos de I CE
[283]
: Consumidor
: Queue
: Productor
get () wait ()
notify
put ()
return item
Figura 7.19: Representación gráfica del uso de un monitor.
Listado 7.28: Utilizando monitores 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <IceUtil/Monitor.h> #include <IceUtil/Mutex.h> #include <deque> using namespace std; template<class T> class Queue : public IceUtil::Monitor<IceUtil::Mutex> { public: void put (const T& item) { // Añade un nuevo item. IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); _queue.push_back(item); notify(); } T get () { // Consume un item. IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); while (_queue.size() == 0) wait(); T item = _queue.front(); _queue.pop_front(); return item; } private: deque<T> _queue; // Cola de doble entrada. };
Como se puede apreciar, la clase definida es un tipo particular de monitor sin semántica recursiva, es decir, definido a partir de IceUtil::Mutex. Dicha clase tiene como variable miembro una cola de doble entrada que maneja tipos de datos genéricos, ya que la clase definida hace uso de una plantilla. Además, esta clase proporciona las dos operaciones típicas de put() y get() para añadir y obtener elementos. Hay,