1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_core_mt_ThreadManager_hpp
10 #define anna_core_mt_ThreadManager_hpp
14 #include <anna/core/mt/SafeRecycler.hpp>
15 #include <anna/core/mt/Thread.hpp>
17 #include <anna/core/core.hpp>
24 Gestor de threads. Optimiza la creacin y uso de los threads. Como ventaja adicional limita
25 el numero de threads que puede ser creados.
27 class ThreadManager : SafeRecycler <Thread> {
30 Modos de funcionamiento
36 Unlimit, /**< Permite crear tantos threads como sea necesario. */
37 ExceptionWhenFull, /**< Si no hay ningun thread libre lanza una excepcion */
38 LockWhenFull /**< Si no hay ningun thread libre el metodo que invoca a #createThread queda
39 bloqueado hasta que algun otro thread termine su tarea. */
42 anna_declare_enum(Mode);
45 typedef iterator thread_iterator;
49 @param name Nombre logico del la gestor de threads.
50 \param mode Modo de funcionamiento de ester gestor de threads.
51 @param maxSize Numero maximo de threads que seran creados.
52 \param flags Flags aplicados a los threads creados por este gestor.
54 ThreadManager(const char* name, const Mode::_v mode, const int maxSize, const int flags = Thread::Flag::None);
58 Crea un gestor de thread que puede crecer con un número ilimitado de threads.
59 @param name Nombre logico del la gestor de threads.
60 \param flags Flags aplicados a los threads creados por este gestor.
62 ThreadManager(const char* name, const int flags = Thread::Flag::None);
67 virtual ~ThreadManager();
70 * Devuelve el nombre asociado a este gestor.
71 * \return el nombre asociado a este gestor.
73 const std::string& getName() const throw() { return a_name; }
76 Obtiene la instancia de un thread. El thread sólo se liberará de forma automática cuando se termine la ejecución del mismo.
77 \return La instancia de un thread.
79 \warning Solo debe haber un único punto de creación de thread's por cada instancia de esta clase.
81 Thread* createThread() throw(RuntimeException);
84 * Bloquea el proceso hasta que todos los threads lanzados por este gestor hayan terminado su ejecución.
85 * \warning \li No debería invocarse desde un thread que haya sido creado por este gestor.
86 * \li Los threads deberían crearse con el flag Thread::Flag::Joinable.
88 void join() throw(RuntimeException);
91 Devuelve un iterador al comienzo de la lista de threads.
92 \return un iterador al comienzo de la lista de threads.
94 thread_iterator thread_begin() throw() { return begin(); }
97 Devuelve un iterador al final de la lista de threads.
98 \return un iterador al final de la lista de threads.
100 thread_iterator thread_end() throw() { return end(); }
103 Devuelve el thread referenciado por el iterador recibido como parametro.
105 \return el thread referenciado por el iterador recibido como parametro.
107 static Thread* thread(thread_iterator ii) throw() { return SafeRecycler <Thread>::data(ii); }
110 * Devuelve una cadena con la información relevante sobre este gestor de threads
111 * \return una cadena con la información relevante sobre este gestor de threads
113 std::string asString() const throw();
116 const std::string a_name;
117 const Mode::_v a_mode;
119 Semaphore* a_semaphore;
120 const int a_threadFlags;
123 // Se invoca cuando el thread detecta que va a terminar y que tiene una factoria asociada.
124 void releaseThread(Thread* thread) throw(RuntimeException);