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_Mutex_hpp
10 #define anna_core_mt_Mutex_hpp
14 #include <anna/core/mt/Safe.hpp>
19 Clase para implementar secciones criticas no-reentrantes. El uso general sera el siguiente:
25 <implementacion de la seccion critica>
31 .... tratamiento de la excepcion ...
35 La funcionalidad de esta clase solo estara disponible en aplicaciones multithread.
41 class Mutex : public Safe {
43 struct Mode { enum _v { Recursive, Strict }; };
47 explicit Mutex(const Mode::_v mode = Mode::Recursive);
54 virtual void lock() throw(RuntimeException);
56 virtual void unlock() throw();
59 * Devuelve \em true en caso de que haya conseguido bloquear el mutex, o
60 * \em false en otro caso.
61 * \return \em true en caso de que haya conseguido bloquear el mutex, o
62 * \em false en otro caso.
64 bool trylock() throw(RuntimeException);
67 * Operador de conversión.
68 * \return El \em pthread_mutex_t asociado a esta instancia.
70 operator const pthread_mutex_t*() const throw() {
83 Mutex(const Mutex& other);
87 * Macro que incorpora la definición de un Mutex e implementa los métodos \em lock y \em unlock
88 * en la clase desde la que se invoca.
90 * \warning Debe invocarse desde la parte privada de la clase para asegurar que las secciones críticas de la
91 * misma sólo se activaran mediante anna::Guard<T>, que es la forma más segura y fácil.
93 #define anna_declare_mutex(ClassName) \
94 anna::Mutex a_autoMutex; \
95 void lock () throw (anna::RuntimeException) { a_autoMutex.lock (); } \
96 void unlock () throw () { a_autoMutex.unlock (); } \
97 friend class anna::Guard <ClassName >;
99 #define anna_access_mutex a_autoMutex