/** * * Representación en C++ de un modelo de monitores para la resolución * del problema del agua * * Author: CI0122 Sistemas Operativos * Date: 2023/Abr/23 * **/ #include #include "Natural.h" /** * Default constructor **/ Natural::Natural() { this->contadorHidrogenos = 0; this->contadorOxigenos = 0; } /** * Destructor **/ Natural::~Natural() { } /** * **/ int Natural::registraYEspera( int atomo, int worker ) { this->lock.Acquire(); printf( "%d Registrando ... O = %d, H = %d\n", worker, this->contadorOxigenos, this->contadorHidrogenos ); switch ( atomo ) { case AtomoHidrogeno: if ( this->contadorOxigenos > 0 && this->contadorHidrogenos > 0 ) { this->contadorHidrogenos--; this->contadorOxigenos--; this->hidrogenos.Signal(); this->oxigenos.Signal(); printf( "\tUn H hizo agua [O(%d), H(%d)]\n", this->contadorOxigenos, this->contadorHidrogenos ); } else { this->contadorHidrogenos++; this->hidrogenos.Wait( this->lock ); } break; case AtomoOxigeno: if ( this->contadorHidrogenos > 1 ) { this->contadorHidrogenos -= 2; this->hidrogenos.Signal(); this->hidrogenos.Signal(); printf( "\tUn O hizo agua [O(%d), H(%d)]\n", this->contadorOxigenos, this->contadorHidrogenos ); } else { this->contadorOxigenos++; this->oxigenos.Wait( this->lock ); } break; } this->lock.Release(); return 0; }