Desarrollo de videojuegos 1: arquitectura del motor de videojuegos (2ª edición)

Page 301

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,


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.